高效复制大numpy数组的切片到较小的连续内存数组
我需要把一个大numpy数组中的一部分高效地复制到另一个较小的数组里。最终,这个较小的数组会作为一个二维数组传递给一个C语言的函数进行处理。因此,子数组的数据必须在一块连续的内存中复制。
在下面的例子中,我试图预先分配这个较小的数组(aa),以提高效率,但我觉得这样每次迭代时都会创建一个新的数组,然后再进行复制。
import numpy as np
M=1024
N=8
a = np.zeros((2,M),dtype=np.float32,order='C')
aa = np.zeros((2,N),dtype=np.float32,order='C')
for n in xrange(M/N):
aa = a[:,n*N:n*N+N]
#pass array to c function - e.g. foo(aa,aa.shape[0],aa.shape[1])
print aa
a[:,n*N:n*N+N] = aa
1 个回答
2
你想要做的是 aa[:] = a[:, n*N:n*N+N]
,这样可以把 a
中的数据复制到已经存在的 aa
数组里,而不是每次都创建一个新的数组,然后把旧的丢掉。
编辑 再想想原问题的情况,因为子数组是通过切片提取的,所以在每次循环中,aa
并不会是一个新的数组,而是对 a
数组的一个新视图。这意味着它可能不是连续的,这可能比性能问题更值得关注。最开始分配的 aa
数组在第一次循环中就被垃圾回收了,因为没有被使用。