高效复制大numpy数组的切片到较小的连续内存数组

2 投票
1 回答
1701 浏览
提问于 2025-04-19 22:34

我需要把一个大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 数组在第一次循环中就被垃圾回收了,因为没有被使用。

撰写回答