[英]clearing elements of numpy array
有沒有一種簡單的方法可以清除numpy數組的所有元素? 我試過了:
del arrayname
這將完全刪除陣列。 我在for循環中使用這個數組,迭代數千次,所以我更喜歡保留數組,但每次都用新元素填充它。
我試過numpy.delete,但是根據我的要求,我沒有看到使用子陣列規范。
*已編輯 *:
數組大小不會相同。
我在開頭的循環內部分配空間,如下所示。 如果這是一個錯誤的方法,請糾正我:
arrname = arange(x*6).reshape(x,6)
我讀取數據集並為數據集中的每個元組構造此數組。 我所知道的是列數將是相同的但不是行數。 例如,我第一次需要一個大小為(3,6)的數組,下一個元組為(1,6),下一個為(4,6),依此類推。 我填充數組的方式如下:
arrname[:,0] = lstname1
arrname[:,1] = lstname2
...
換句話說,列是從元組構造的列表中填充的。 因此,在下一個循環開始之前,我想清除它的元素並為連續循環做好准備,因為我不希望前一個循環中的殘余混合當前內容。
我不清楚你的意思是清楚,數組總會有一些值存儲在其中,但你可以將這些值設置為某些值,例如:
>>> A = numpy.array([[1, 2], [3, 4], [5, 6]], dtype=numpy.float)
>>> A
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])
>>> A.fill(0)
>>> A
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>> A[:] = 1.
>>> A
array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
更新
首先,你的問題很不清楚。 你寫出一個好問題的努力越多,你得到的答案就越好。 一個好問題應該讓我們清楚你要做什么以及為什么做。 此外,示例數據非常有用,只是一小部分,因此我們可以准確地看到您正在嘗試做什么。
話雖如此。 看起來你應該為每次迭代創建一個新數組。 創建數組的速度非常快,當大小和內容需要更改時,為什么要重用數組並不清楚。 如果您出於性能原因嘗試重用它,則可能不會發現任何可測量的差異,調整數組大小並不比創建新數組快得多。 您可以通過調用numpy.zeros((X, 6))
來創建一個新數組
也在你的問題中你說:
從元組構造的列表中填充列
如果您的數據已經作為元組列表存放,則使用numpy.array
將其轉換為數組。 你不需要去創建一個數組並填充它。 例如,如果我想從元組列表中獲取(2,3)數組,我會這樣做:
data = [(0, 0, 1), (0, 0, 2)]
A = numpy.array(data)
# or if the data is stored like this
data = [(0, 0), (0, 0), (1, 2)]
A = numpy.array(data).T
希望有所幫助。
隨着手指的搖擺可能過早優化,我會提出一些想法:
你說你不希望從之前的迭代遺留下來的任何遺留物。 從您的代碼中可以看出,您為每個已知數量的列逐列填充每個新元素。 “遺留”值似乎不是問題。 考慮:
使用arange和reshape沒有任何意義。 使用np.empty((n,6))
。 速度比ones
或zeros
由頭發。
你也可以從成分中構建你的新數組
看到:
lstname1 = np.arange(3)
lstname2 = 22*np.arange(3)
np.vstack((lstname1,lstname2)).T
# returns
array([[ 0, 0],
[ 1, 22],
[ 2, 44]])
#or
np.hstack((lstname1[:,np.newaxis],lstname2[:,np.newaxis]))
array([[ 0, 0],
[ 1, 22],
[ 2, 44]])
最后,如果你真的真的關心速度,你可以分配最大的預期大小(如果不知道你可以檢查請求的大小與最后一個最大,如果它更大,那么使用np.empty((rows,cols))
增加大小。
然后在每次迭代時,您創建一個更大矩陣的視圖,只需要您想要的行數。 這將導致numpy重用相同的緩沖區空間,而不需要在每次迭代時進行任何分配。 注意:
In [36]: big = np.vstack((lstname1,lstname2)).T
In [37]: smaller = big[:2]
In [38]: smaller[:,1]=33
In [39]: smaller
Out[39]:
array([[ 0, 33],
[ 1, 33]])
In [40]: big
Out[40]:
array([[ 0, 33],
[ 1, 33],
[ 2, 44]])
注意這些建議適合您的擴展問題,並且不適合您之前關於“清除”數組的問題。 即使在后一個示例中,您也可以輕松地說smaller.fill(0)
來消除關注點,具體取決於您是否可以在迭代中可靠地重新分配數組的所有元素。
如果要保持分配的數組,並且具有相同的大小,則無需清除元素。 只需跟蹤您的位置,並覆蓋數組中的值。 這是最有效的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.