2011-07-23 16 views
1

このようなブロックの値を決定するためにユーザ定義関数を使用して、サイズが19のブロックが要素を構成する特殊な配列をソートする必要があります。Pythonでコンテナを並べ替える/ numpy

最初の試みは、クラス内の配列をラップし、[]演算子オーバーロードすることであった:私は渡された比較演算子を供給するこのような構造を使用

class W: 
    def __init__(self, filename="nn.txt"): 
     self.nn = array([int(i) for i in open(filename, "r").readlines()[1:]]) 
     self.size = self.nn.size/19 

    def __getitem__(self, idx): 
     return self.nn[idx:idx+19] 

    def __len__(self): 
      return self.size 

)を(ソート:

def avg_cmp(x, y): 
    return int(average(x)) - int(average(y)) 

u = W("nnsmall.txt") 
sorted(u, cmp=avg_cmp) 

ただし、このアプローチは遅すぎます。

ヒント?

答えて

4

あなたはsorted(u, key=average)を試しましたか?これは各列の平均を1回だけ計算します。

アレイのサイズは、残りすることなく19によって常に割り切れる場合:

>>> import numpy as np 
>>> n = 2 
>>> u = np.array([v for v in range(19*n)]) 

>>> u = u.reshape(n,19) 

>>> sorted(c, key=np.average) 

[array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]), 
array([19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37])] 
+0

かなり性能が向上されたこと。ありがとうございました。 – kyrre

関連する問題