簡體   English   中英

如何迭代和修改 numpy 數組?

[英]How to iterate and modify over a numpy array?

我有一個數組,我想通過插入或刪除來迭代並修改數組本身。

for idx, ele in enumerate(np.nditer(array)):
  if idx + 1 < array.shape[0] and ele > array[idx+1]:
    array = np.delete(array, idx+1)
  print(ele)

給定 [5, 4, 3, 2, 1] 我希望循環打印出 5 3 1 因為 4 和 2 比它們之前的元素小。 但是因為 python 基於array的第一個實例創建了一個迭代器,所以它打印 5 4 3 2 1。我想知道我是否可以得到

一般來說,如果我在循環體內修改數組,我希望修改迭代器。

您不能改變 numpy 數組的長度,因為 numpy 在創建數組時為其分配所需的 memory。

array = np.delete(array, idx+1)

您正在=的右側創建一個新數組並重新分配名稱array

enumerate(np.nditer(array))的返回值已在此時創建,並且不會識別名稱array已被重新綁定。

原則上,您可以迭代一個序列並同時改變它的長度(通常不是一個好主意)。 object 只需要具有允許您改變其長度的方法(例如列表)。

考慮:

>>> l = [5, 4, 3, 2, 1]                                                         
>>> for idx, ele in enumerate(l): 
...:     if ele == 3: 
...:         l.pop(idx) # mutates l 
...:     print(ele) 
...:                                                                            
5
4
3
1
>>> l                                                                           
[5, 4, 2, 1]

請注意

  1. l變異了。
  2. 該循環不會打印2 ,因為彈出一個元素會將所有剩余元素的索引減少 1。 現在l[2] == 2 ,但是索引2已經被迭代器訪問過,所以下一個打印調用打印l[3]是 1。

這證明了對l的突變對后續迭代有影響。

您在尋找 boolean 索引嗎?

>>> import numpy as np
>>> a = np.arange(1, 6)
>>> a
array([1, 2, 3, 4, 5])
>>> 
>>> condition = a != 3
>>> a[condition]
array([1, 2, 4, 5])

您可以使用where方法查找滿足某些條件的元素的索引,而不是循環遍歷數組。

然后要刪除選定的元素(或多個元素),您可以使用delete方法,傳遞源數組和索引列表。 然后保存結果,例如在同一個變量下。

添加元素,您可以使用append插入方法(有關詳細信息,請參閱Numpy文檔)。

我還發現了一篇關於如何在數組上循環和刪除的 SO 帖子。 請參閱使用迭代從 numpy 數組中刪除元素

暫無
暫無

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

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