當前位置: 首頁>>技術問答>>正文


在NumPy中如何創建一個空的數組/矩陣?

如何以我通常使用列表(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 = 5n = 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.]]

numpy

參考文獻

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3717.html,未經允許,請勿轉載。