2014-09-05 39 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