[英]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]
請注意
l
變異了。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.