2015-10-04 56 views
1

如何預先分配數組的數組,以便我可以更有效地追加一點。在Matlab中有一個稱爲cell(required_length)的函數,用於預先分配可存儲數組的單元格。預分配榜單

我有目前看起來像一個陣列:

a=np.array([[1,2],[1],[2,3,4]])  
b=np.array([[20,2]])  

但是我想追加1000個陣列,其是像圖示但在大小改變「B」的。

回答

5

這不僅僅是預分配數組的一個問題,如np.empty((100,), dtype=int)。這是一個關於如何將大量列表收集到一個結構中的問題,無論它是列表還是數組。在我看來,與MATLAB單元的比較已經足夠值得進一步討論。


我想你應該使用Python列表。它們可以包含不同大小的列表或其他對象(包括數組)。您可以輕鬆追加更多項目(或使用擴展添加多個對象)。 Python永遠擁有它們; MATLAB添加了單元以接近該靈活性。

np.arraysdtype=object是相似的 - 指向對象(如列表)的指針數組。大多數情況下,它們只是包含數組封裝的列表。您可以將數組初始化爲較大的大小,然後插入/設置項目。

A = np.empty((10,),dtype=object) 

產生一個包含10個元素的數組,每個元素None

A[0] = [1,2,3] 
A[1] = [2,3] 
... 

您還可以將元素連接到現有數組,但結果是新的。有一個np.append函數,但它只是一個覆蓋concatenate;它不應該與列表append混淆。

如果它必須是一個數組,那麼最後可以從列表中輕鬆構造它。這就是你的np.array([[1,2],[1],[2,3,4]])

How to add to numpy array entries of different size in a for loop (similar to Matlab's cell arrays)?


速度的問題,讓我們嘗試簡單的時間測試

def witharray(n): 
    result=np.empty((n,),dtype=object) 
    for i in range(n): 
     result[i]=list(range(i)) 
    return result 

def withlist(n): 
    result=[]       
    for i in range(n): 
     result.append(list(range(i))) 
    return result 

其產生

In [111]: withlist(4) 
Out[111]: [[], [0], [0, 1], [0, 1, 2]] 

In [112]: witharray(4) 
Out[112]: array([[], [0], [0, 1], [0, 1, 2]], dtype=object) 

In [113]: np.array(withlist(4)) 
Out[113]: array([[], [0], [0, 1], [0, 1, 2]], dtype=object) 

timetests

In [108]: timeit withlist(400) 
1000 loops, best of 3: 1.87 ms per loop 

In [109]: timeit witharray(400) 
100 loops, best of 3: 2.13 ms per loop 

In [110]: timeit np.array(withlist(400)) 
100 loops, best of 3: 8.95 ms per loop 

簡單構建列表的列表是最快的。但是,如果結果必須是對象類型數組,那麼將值分配給空數組會更快。