2014-09-05 37 views
2

我需要尽可能有效地将切片从大的numpy阵列复制到另一个较小的阵列。最终,较小的数组将作为二维数组传递给C函数进行处理。因此,必须将子数据数据复制到连续的内存块中。有效地将较大的numpy阵列的切片复制到较小的连续内存阵列

在下面的示例中,我试图预先分配较小的阵列(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 

回答

2

你想干什么aa[:] = a[:, n*N:n*N+N],这样从a的数据复制到现有的预aa阵列,而不是在每次迭代中创建一个新的,和其他的扔掉。

EDIT思考两次关于OP的情况下,由于子阵列与切片萃取,aa不会在每次迭代一个新的数组,而是一种新的视图到阵列a。所以它不会是连续的,这可能比性能更重要。最初分配的aa数组在第一次迭代中未使用垃圾收集。

+0

我一直在想这件事。所以,如果'aa'被初始化为一个数组,'aa [:] = ...'将数据复制到预先存在的数组中?而如果我们写'aa = a',它会用'a [']'写'aa'? – 2014-09-05 12:53:33

+1

类别。当你添加'[:]'时,你会触发对ndarray的'__setitem__'方法的调用,该方法试图将rhs复制到数组中。如果你不这样做,那么正常的Python语义正在工作,并且你在lhs上指定标签以指向rhs上的对象。如果lhs标签指向别的东西,它就不再会了,因此它可能会被垃圾收集。 – Jaime 2014-09-05 14:00:20