2016-12-21 14 views
3

この「問題」の背景は、私が大規模なPythonプロジェクトを最適化しようとしていることです。私は、プログラムをタイミング開始し、実行時間のほぼ50%がこの1と同様の計算に費やされていることに気づい:私はこれより早く作るための方法を見つけることを試みてきましたNumpy:効率的な行列計算A * xjここでxjはXの行jです

import numpy as np 

# Example 
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 
X = np.random.multivariate_normal([0,0,0,0],np.eye(4),15000) 

# Create a lambda function to use row based 
F = lambda x: np.dot(A,x) 

# Now calculating the value 
answer = np.apply_along_axis(F, 1, X) 

print answer.shape 

、しかしに走り続けます壁。これは本当にこれを行うのに最適ですか?

答えて

5

Anp.dotを使用して2番目の軸をそれぞれ失うことができます。 np.dotに入力するには、Xを最初の入力として使用し、Aを転置して2番目の軸を前面に移動して2番目の入力として使用します。

したがって、我々はそうのような出力を持っているでしょう -

X.dot(A.T) 

ランタイム質問に記載されているサンプル入力のテスト -

In [192]: %timeit np.apply_along_axis(F, 1, X) 
1 loops, best of 3: 185 ms per loop 

In [193]: %timeit X.dot(A.T) 
1000 loops, best of 3: 228 µs per loop 

In [194]: np.allclose(np.apply_along_axis(F, 1, X), X.dot(A.T)) 
Out[194]: True # verified results against original code 
+1

うわー!これは驚異的なスピードアップです! 私はコードでこの答えにリンクします、ありがとう:) – Dammi

+0

@piRSquaredねえ!さて、私は早くそれを見て、そこに作られた点は私には意味がある、私はそれがすでに好きだった:)私はあなたが繰り返しインデックスがたくさんある場合に役立つ 'np.take'について指摘することを考えていたと思います。その点は、@ hpauljによってリンクされているQ&Aのコメントにありました。だから、コメントと一緒にQ&Aのコメントでは、トピックについての議論をかなり包括的にしています。それらのことを研究するのはいい仕事です! – Divakar

+0

@Divakarありがとう – piRSquared

関連する問題