2011-08-07 17 views
5

私はいくつかのデータ分析を行うためにPythonとNumpyを使用しています。3Dアレイでの効率的な反復?

私は大きな3Dマトリックス(NxNxN)を持っています。ここで、各セルは再びマトリックスです。今回は3x3マトリックスです。行列dataを呼び出すと、それは次のようになります。

data[N,N,N,3,3] 

私はすべての3×3行列の固有値を見つける必要があり、そのために私はnumpyののeigvalsルーチンを使用しますが、それは何をする年齢になります。今、私はかなりこれをやっています。

for i in range(N): 
    for j in range(N): 
     for k in range(N): 
      a = np.linalg.eigvals(data[i,j,k,:,:]) 

N = 256の場合、これには約1時間かかります。どのようにこれをより効率的にするためのアイデアですか?

ご意見ありがとうございました!

+4

あなたはプロファイルされていますか?私はあなたが反復しているよりもずっと多くの時間をeigvalsに費やしていると思っています。 – matt

+3

eigvalsは私のtimeitの計算では約3桁長くかかるので、反復を変更することは何にも影響を及ぼさないと思います。 – DSM

答えて

5

は、美的にはネストされたループよりも優れています。しかし、私はそれがあなたのコードをはるかに速くするとは思わない。私のテストは、反復はあなたのボトルネックではないことを示唆しています。

>>> bigdata = numpy.arange(256 * 256 * 256 * 3 * 3).reshape(256, 256, 256, 3, 3) 
>>> %timeit numpy.linalg.eigvals(bigdata[100, 100, 100, :, :]) 
10000 loops, best of 3: 52.6 us per loop 

ので過小評価:

かなり新しいです私のコンピュータ上で14分の最小値をだ
>>> .000052 * 256 * 256 * 256/60 
14.540253866666665 

。のは、ループはDSMが言ったように、より小さな大きさの...

>>> def just_loops(N): 
...  for i in xrange(N): 
...   for j in xrange(N): 
...    for k in xrange(N): 
...     pass 
... 
>>> %timeit just_loops(256) 
1 loops, best of 3: 350 ms per loop 

注文を取るどのくらい見てみましょう。単独の配列をスライスするのでさえ仕事がより充実している:

>>> def slice_loops(N, data): 
...  for i in xrange(N): 
...   for j in xrange(N): 
...    for k in xrange(N): 
...     data[i, j, k, :, :] 
... 
>>> %timeit slice_loops(256, bigdata) 
1 loops, best of 3: 33.5 s per loop 
+0

非常に徹底的な答えをありがとう!あなたのテストから、それをもっと速くするためにあまり行われていないように見えます。 – digitaldingo

3

NumPyでこれを行うには良い方法があると確信していますが、一般にitertools.productはネストされたループよりも速いです。

from itertools import product 

for i, j, k in product(xrange(N), xrange(N), xrange(N)): 
    a = np.linalg.eigvals(data[i,j,k,:,:]) 
+0

この場合、Nは非常に小さいので、ループオーバーヘッドはネストされた範囲よりも製品ループで約2倍大きいことが実際に分かります。私はまだ製品のアプローチがより好きです。なぜなら、それはより平坦で、オーバーヘッドはここでは無視できるからです。 – DSM

+0

それは面白いです。 65536 + 256の内部リストを作成するのが遅くなる(私はそれが大きな違いを生むとは思わなかったが)。 – agf

2

すべての計算が独立しているので、あなたは、マルチコアプロセッサを持っている場合、あなたは計算を高速化するマルチプロセッシングモジュールを使用することができます。

関連する問題