如何以我通常使用列表(List)的方式使用Numpy數組或矩陣? 我想創建一個空的數組(或矩陣),然後每次添加一列(或行)到這個數組(或矩陣)。
目前能想到的方法是:
mat = None
for col in columns:
if mat is None:
mat = col
else:
mat = hstack((mat, col))
而如果它是一個列表,我會這樣做:
list = []
for item in data:
list.append(item)
有沒有辦法在NumPy中這樣使用數組或矩陣?
最佳解決方案
上麵對Numpy的使用觀念可能有誤。 NumPy數組存儲在連續的內存塊中,如果要將行或列添加到現有數組中,則需要將整個數組複製到一個新的內存塊,從而為要存儲的新元素創建間隙。如果重複建立一個數組,這是非常低效的。
在添加行的情況下,最好的辦法是創建一個與您的數據集最終大小一樣的數組,然後向其中按行添加數據:
>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1., 2.],
[ 2., 3.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
次佳解決方案
NumPy數組是一個與列表非常不同的數據結構,它被設計為以不同的方式使用。您對hstack
的使用可能非常低效……每當您調用它時,現有數組中的所有數據都將被複製到一個新的數據中。 (append
函數將有相同的問題。)如果您想一次構建您的隻有一個列的矩陣,最好將它保存在列表中,直到它完成,然後才轉換為一個數組。
例如
mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
item
可以是一個列表,一個數組或任何可迭代的結構,隻要每個item
具有相同數量的元素。在這個特定的情況下(data
是一些迭代持有矩陣列),你可以簡單地使用
mat = numpy.array(data)
(還要注意,使用list
作為變量名可能不是一個好的做法,因為它掩蓋了內置類型的名稱,這可能會導致錯誤。)
編輯:
如果由於某種原因,你真的想創建一個空的數組,你可以使用 numpy.array([])
,但這是很少有用的!
第三種解決方案
在NumPy中創建一個空的多維數組(例如一個二維數組m*n
來存儲你的矩陣),如果你不知道(m
)你會追加多少行,而不關心計算成本(即在每次附加元素時re-buildinging數組),您可以設置0為要添加到的維度:X = np.empty(shape=[0, n])
。
這樣你可以使用例如(這裏我們假設我們不知道什麽時候創建空矩陣m = 5
和n = 2
):
import numpy as np
n = 2
X = np.empty(shape=[0, n])
for i in range(5):
for j in range(2):
X = np.append(X, [[i, j]], axis=0)
print X
這會給你:
[[ 0. 0.]
[ 0. 1.]
[ 1. 0.]
[ 1. 1.]
[ 2. 0.]
[ 2. 1.]
[ 3. 0.]
[ 3. 1.]
[ 4. 0.]
[ 4. 1.]]