如何在numpy数组上进行迭代和修改?

时间:2019-11-03 14:23:58

标签: python numpy numpy-ndarray

我有一个数组,我想通过插入或删除来迭代并修改数组本身。

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。我想知道是否可以获取

一般来说,如果我在循环体内修改数组,我希望修改迭代器。

2 个答案:

答案 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]

注意

  1. l被突变了。
  2. 循环不会打印2,因为弹出一个元素会使所有其余元素的索引减一。现在l[2] == 2,但是迭代器已经访问了索引2,因此下一个打印调用将打印l[3],即为1。

这证明l的突变会影响后续迭代。

答案 1 :(得分:0)

代替遍历数组,可以使用 where 方法查找 满足一定条件的元素的索引。

然后删除所选元素(或多个元素),您可以使用 delete 方法,传递源数组和索引列表。 然后保存结果,例如在相同的变量下。

添加一个元素,可以使用追加插入方法 (有关详细信息,请参见 Numpy 文档)。

我还找到了一个关于如何循环和删除数组的SO帖子。 参见Deleting elements from numpy array with iteration