如何預先分配數組的數組,以便我可以更有效地追加一點。在Matlab中有一個稱爲cell(required_length)的函數,用於預先分配可存儲數組的單元格。預分配榜單
我有目前看起來像一個陣列:
a=np.array([[1,2],[1],[2,3,4]])
b=np.array([[20,2]])
但是我想追加1000個陣列,其是像圖示但在大小改變「B」的。
如何預先分配數組的數組,以便我可以更有效地追加一點。在Matlab中有一個稱爲cell(required_length)的函數,用於預先分配可存儲數組的單元格。預分配榜單
我有目前看起來像一個陣列:
a=np.array([[1,2],[1],[2,3,4]])
b=np.array([[20,2]])
但是我想追加1000個陣列,其是像圖示但在大小改變「B」的。
這不僅僅是預分配數組的一個問題,如np.empty((100,), dtype=int)
。這是一個關於如何將大量列表收集到一個結構中的問題,無論它是列表還是數組。在我看來,與MATLAB單元的比較已經足夠值得進一步討論。
我想你應該使用Python列表。它們可以包含不同大小的列表或其他對象(包括數組)。您可以輕鬆追加更多項目(或使用擴展添加多個對象)。 Python永遠擁有它們; MATLAB添加了單元以接近該靈活性。
np.arrays
與dtype=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
簡單構建列表的列表是最快的。但是,如果結果必須是對象類型數組,那麼將值分配給空數組會更快。