2013-09-23 9 views
6

以下のコードを、私が望むもの(クリギングメソッドの一部です)とまったく同じようにしています。しかし、問題はそれが遅すぎるということです.forループをnumpyにプッシュするオプションがあるかどうかを知りたいのですが? numpy.sumを押し出してそこの軸引数を使用すると、速度は少し上がりますが、明らかにそれがボトルネックではありません。私はforloopを押し下げることができる方法上の任意のアイデアは、それをスピードアップするためにnumpyのために、あるいは他の方法は、それをスピードアップするために?)forループをnumpyにプッシュする方法

# n = 2116 
print GRZVV.shape # (16309, 2116) 
print GinvVV.shape # (2117, 2117) 
VVg = numpy.empty((GRZVV.shape[0])) 

for k in xrange(GRZVV.shape[0]): 
    GRVV = numpy.empty((n+1, 1)) 
    GRVV[n, 0] = 1 
    GRVV[:n, 0] = GRZVV[k, :] 
    EVV = numpy.array(GinvVV * GRVV) # GinvVV is numpy.matrix 
    VVg[k] = numpy.sum(EVV[:n, 0] * VV) 

は私がいくつかのもの

をクリアするndarrays n列の行列の次元を掲載しました

編集:VVの形状あなたは基本的にベクトルのすべての要素を付加し、GinvVVでそれを乗算する、末尾に1を追加し、GRZVVの各行を取っている2116

+1

何形状は ' VV? –

+0

'VV.shape ==(16309、)'ならば、 '(n、)'という形をした 'EVV [:n、0]'によってどのようにmulitplyできますか? – askewchan

+0

ループの最後の行に 'EVV [:n、0] * VV [k]'があるはずです。これは@ Jaimeの答えが想定しているようです。 – askewchan

答えて

5

あなたはKの上にループの代わりに、次のことを行うことができます(実行時〜3S):

tmp = np.concatenate((GRZVV, np.ones((16309,1),dtype=np.double)), axis=1) 
EVV1 = np.dot(GinvVV, tmp.T) 
#Changed line below based on *askewchan's* recommendation 
VVg1 = np.sum(np.multiply(EVV1[:n,:],VV[:,np.newaxis]), axis=0) 
+1

これは@ usethedeathstarのコードと同じ結果をもたらし、マシンで15倍高速に動作します。 – askewchan

+1

'np.multiply'ブロードキャストのように、タイルコールの必要はありません。これを以下のように変更します: 'VVg1 = np.sum(np.multiply(EVV1 [:n、:]、VV [:、np.newaxis])、axis = 0)' – askewchan

+0

+1いいえコール....上記の行を編集しました...ありがとう –

3

あります。でも

VVg = np.sum(np.dot(GinvVV[:, :-1], GRZVV.T), axis=-1) * VV 

か:あなたは「1を追加」ことをやっていなかった場合は、何らのループでそれをすべて行うことができ

VVg = np.einsum('ij,kj->k', GinvVV[:, :-1], GRZVV) * VV 

はどのように我々は、余分な1を処理していますか?行列の乗算から得られる結果のベクトルは、GinvVV[:, -1]の対応する値で増分され、それらをすべて加算すると、値はnp.sum(GinvVV[:, -1])だけ増分されます。だから我々は単に一度これを計算し、リターンベクトルのすべての項目に追加することができます:

VVg = (np.einsum('ij,kj->k', GinvVV[:-1, :-1], GRZVV) + np.sum(GinvVV[:-1, -1])) * VV 

VVがスカラーである場合、上記のコードは動作します。それは形状(n,)の配列がある場合は、次のように動作します:

GinvVV = np.asarray(GinvVV) 
VVgbis = (np.einsum('ij,kj->k', GinvVV[:-1, :-1]*VV[:, None], GRZVV) + 
      np.dot(GinvVV[:-1, -1], VV)) 
+1

@ usethedeathstarの編集で、 'VV.shape'は2116になりましたので、あなたの解決策では放送しません(' Wg.shape'は16309 ) – askewchan

+0

それはスカラーであると考えました。完全な配列では、Joelの答えのように最後まで配列を崩壊させないで、大きな配列の場合よりもはるかに高速です。 – Jaime

関連する問題