2011-12-28 178 views
7

numpyのnumpy.apply_along_axis()関数が単純なPythonループよりも優れていると、私は混乱します。例えば、多くの行の行列の場合を考えると、あなたは、各行の合計を計算したい:なぜnumpy.apply_along_axisがPythonループよりも遅いようですか?

x = np.ones([100000, 3]) 
sums1 = np.array([np.sum(x[i,:]) for i in range(x.shape[0])]) 
sums2 = np.apply_along_axis(np.sum, 1, x) 

(ここでは私もnp.sum、ビルトインnumpyの機能を使用していて、まだsums1を計算しますPythonループ)は、sums2apply_along_axis)の計算には2000ms(WindowsではNumPy 1.6.1)を使用します。さらにRのrowMeans関数を20ms未満で実行することができます(私はCコードを呼び出すことができます)。同様のR関数apply()は約600msで実行できます。あなたは、単にこれはあなたが提起した2つの方法よりもはるかに高速である

sums3 = np.sum(x, axis=1) 

を使用して合計を計算できるよう

+0

残念ながら、軸に沿って適用することは、スピードに関係のないタスクのみの選択肢と思われる。 – Wizard

答えて

10

np.sumは、axisパラメータを取ります。

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.apply_along_axis(np.sum, 1, x)" 
1 loops, best of 1: 3.21 sec per loop 

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.array([np.sum(x[i,:]) for i in range(x.shape[0])])" 
1 loops, best of 1: 712 msec per loop 

$ python -m timeit -n 1 -r 1 -s "import numpy as np;x=np.ones([100000,3])" "np.sum(x, axis=1)" 
1 loops, best of 1: 1.81 msec per loop 

apply_along_axisが遅い理由について - 。私は関数は、純粋なPythonで書かれており、配列バージョンよりもはるかに多くの一般的なので、あまり最適化の機会ですおそらくので、わかりません)

関連する問題