我对numpy的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)
在这里,我什至使用内置的numpy函数
np.sum
,但是计算sums1
(Python循环)所花费的时间不到400毫秒,而计算sums2
(apply_along_axis
)所花费的时间却超过2000毫秒(Windows上为NumPy 1.6.1)。通过进一步的比较,R的rowMeans函数通常可以在不到20ms的时间内完成此操作(我很确定它正在调用C代码),而类似的R函数apply()
可以在约600ms内完成此操作。 最佳答案
np.sum
采用axis
参数,因此您可以使用以下方法简单地计算总和
sums3 = np.sum(x, axis=1)
这比您提出的两种方法快得多。
$ 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编写的,并且比数组版本更通用,因此优化机会也更少。)关于python - 为什么numpy.apply_along_axis似乎比Python循环慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8652785/