改变numpy函数输出数组到位

hal*_*rlu 6 python arrays numpy function in-place

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

def original_func(A):
    return A[1:] + A[:-1]
Run Code Online (Sandbox Code Playgroud)

为了加速并避免为每个函数调用分配新的输出数组,我想将输出数组作为参数,并在适当的位置更改它:

def inplace_func(A, out):
    out[:] = A[1:] + A[:-1]
Run Code Online (Sandbox Code Playgroud)

但是,当以下列方式调用这两个函数时,

A = numpy.random.rand(1000,1000)
out = numpy.empty((999,1000))

C = original_func(A)

inplace_func(A, out)
Run Code Online (Sandbox Code Playgroud)

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

pv.*_*pv. 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


Oli*_*ier 5

认为答案如下:

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

但是,在第二种情况下,您会将整个新分配的大数组显式复制到保留的内存中.复制此类数组所需的时间与原始操作大致相同,因此实际上您将时间翻倍.

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

compute A[1:] + A[:-1] (~10ms)
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,你这样做

compute A[1:] + A[:-1] (~10ms)
copy the result into out (~10ms)
Run Code Online (Sandbox Code Playgroud)