改变numpy函数输出数组到位

时间:2011-09-23 13:34:51

标签: python arrays function numpy in-place

我正在尝试编写一个对数组执行数学运算并返回结果的函数。一个简化的例子可能是:

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)

原始函数似乎是就地函数的两倍。怎么解释这个?就地功能不应该更快,因为它不必分配内存吗?

3 个答案:

答案 0 :(得分:12)

如果您想就地执行操作,请执行

def inplace_func(A, out):
    np.add(A[1:], A[:-1], out)

这不会创建任何临时值(A[1:] + A[:-1])。

所有Numpy二进制操作都有相应的功能,请在此处查看列表:http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs

答案 1 :(得分:5)

认为答案如下:

在这两种情况下,您都计算A[1:] + A[:-1],在这两种情况下,您实际上都会创建一个中间矩阵。

在第二种情况下会发生的事情是,显式将整个新分配的大数组复制到保留的内存中。复制这样的数组大约需要与原始操作相同的时间,所以实际上你的时间加倍。

总而言之,在第一种情况下,您可以:

compute A[1:] + A[:-1] (~10ms)

在第二种情况下,你做

compute A[1:] + A[:-1] (~10ms)
copy the result into out (~10ms)

答案 2 :(得分:-1)

我同意Olivers的解释。如果要在本地执行操作,则必须手动遍历阵列。这会慢很多,但是如果你需要速度,你可以使用Cython,它可以提供纯C实现的速度。