我有一个数组,我想通过插入或删除来迭代并修改数组本身。
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 21。我想知道是否可以获取
一般来说,如果我在循环体内修改数组,我希望修改迭代器。
答案 0 :(得分:1)
您不能更改numpy数组的长度,因为numpy在创建数组时会为其分配所需的内存。
使用
array = np.delete(array, idx+1)
您正在=
的右侧创建一个新数组,并重新分配名称array
。
此时enumerate(np.nditer(array))
的返回值已经创建,无法识别名称array
已经反弹。
原则上,您可以遍历序列并同时更改其长度(通常不是一个好主意)。该对象只需要具有允许您改变其长度的方法(例如,像列表)。
考虑:
>>> 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
,因为弹出一个元素会使所有其余元素的索引减一。现在l[2] == 2
,但是迭代器已经访问了索引2
,因此下一个打印调用将打印l[3]
,即为1。这证明l
的突变会影响后续迭代。
答案 1 :(得分:0)
代替遍历数组,可以使用 where 方法查找 满足一定条件的元素的索引。
然后删除所选元素(或多个元素),您可以使用 delete 方法,传递源数组和索引列表。 然后保存结果,例如在相同的变量下。
要添加一个元素,可以使用追加或插入方法 (有关详细信息,请参见 Numpy 文档)。
我还找到了一个关于如何循环和删除数组的SO帖子。 参见Deleting elements from numpy array with iteration