我需要尽可能有效地将切片从大型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
答案 0 :(得分:2)
您希望执行aa[:] = a[:, n*N:n*N+N]
,以便将a
中的数据复制到预先存在的aa
数组中,而不是在每次迭代中创建一个新数据,并且其他人扔掉了。
编辑考虑OP的情况两次,因为子阵列是用切片提取的,aa
在每次迭代中不会是一个新数组,而是一个新的视图数组a
。因此它不会是连续的,这可能是比性能更大的关注。最初分配的aa
数组在第一次迭代中未使用垃圾回收。