簡體   English   中英

清除numpy數組的元素

[英]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)) 速度比oneszeros由頭發。

  • 你也可以從成分中構建你的新數組

看到:

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)來消除關注點,具體取決於您是否可以在迭代中可靠地重新分配數組的所有元素。

如果要保持分配的數組,並且具有相同的大小,則無需清除元素。 只需跟蹤您的位置,並覆蓋數組中的值。 這是最有效的方法。

我只是開始將新值放入數組中。

但是如果你堅持清除陣列,嘗試使用來制作相同大小的新陣列。

>>> A = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> A
array([[1, 2],
       [3, 4],
       [5, 6]])

>>> A = numpy.zeros(A.shape)
>>> A
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM