我想写一个函数,对数组执行数学运算并返回结果。一个简单的例子可以是:改变numpy函数输出数组
def original_func(A):
return A[1:] + A[:-1]
对于高速化,并避免分配用于每个函数调用一个新的输出阵列,我想有输出数组作为参数,并改变它在适当位置:
def inplace_func(A, out):
out[:] = A[1:] + A[:-1]
然而,在下面的方式调用这两个函数时,
A = numpy.random.rand(1000,1000)
out = numpy.empty((999,1000))
C = original_func(A)
inplace_func(A, out)
原有的功能似乎是快两倍作为就地功能。这怎么解释?不应该因为它不需要分配内存而使得就地功能更快?
作为一个解决方案:我认为* *你必须自己做循环,以避免在奥利弗的回答中描述的中间阵列。或者,也许像http://code.google.com/p/numexpr/可以帮助你?这[问题](http://stackoverflow.com/questions/2937669/linear-combinations-in-python-numpy)也看起来相关。 – gspr
我认为你可以通过这样做来避免中间数组:'out [:] = A [1:]; out + = A [: - 1]'当然你的实际算法可能会变得更加难以精简。当然,不惜一切代价尽量避免循环。你可以用累积和ufuncs做些创造性的事情。 – Paul