【问题标题】:How to update multiple Numpy arrays in a loop如何在循环中更新多个 Numpy 数组
【发布时间】:2019-12-15 14:42:07
【问题描述】:

我想在一个循环中更新(在每个数组前添加额外的元素)许多 numpy 数组,而不必为每个数组重复代码。

我尝试创建所有数组的列表并遍历该列表中的项目并更新每个项目,但这不会改变原始数组。

import numpy as np
arr01 = [1,2,3]
arr02 = [4,5,6]
arr99 = [7,8,9]
print('initial arr01', arr01)
arraylist = [arr01, arr02, arr99]
for array in arraylist:
    array = np.concatenate((np.zeros(3, dtype=int), array))
    print('array being modified inside the loop', array)
print('final arr01', arr01)

在示例代码中,我希望 arr01、arr02、arr03 都用前置零进行修改。

【问题讨论】:

  • np.concatenate 返回一个新数组,array 只是重新分配给该数组。内容(即arraylist 中的 ndarrays)没有被修改。你总是可以通过索引来做到这一点——将for循环更改为for i in range(len(arraylist)):并将array更改为arraylist[i]
  • @PyNoob 这行不通,因为要查看结果,他再次使用了arr01 变量,该变量不受任何arraylist[i] 更改的影响
  • @Saritus 没错,但可以通过打印arraylist[0] 来避免这种情况。如果需要ndarray 方法,我不知道该怎么做。
  • @PyNoob 迭代后可能类似于arr01, arr02, arr99 = arraylist,因此arraylist 内部的所有更改都被复制回原始变量
  • 您不能在 Python 循环中执行此操作。您必须为每个命名数组使用arr02 = np.concatenate((np.zeros(3, int), arr02))。一旦你沿着 'arr01, arr02,...' 路线开始,你就会被它困住。

标签: python arrays loops numpy updates


【解决方案1】:

array = np.concatenate((np.zeros(3, dtype=int), array)) 不会更改当前数组,而是创建一个新数组并将其存储在变量array 中。因此,对于解决方案,您必须更改数组本身的值,这可以通过 array[:] 完成。

这意味着您唯一需要做的改变就是替换这一行

array[:] = np.concatenate((np.zeros(3, dtype=int), array))

所以你的正确解决方案是

import numpy as np
arr01 = [1,2,3]
arr02 = [4,5,6]
arr99 = [7,8,9]
print('initial arr01', arr01)
arraylist = [arr01, arr02, arr99]
for array in arraylist:
    array[:] = np.concatenate((np.zeros(3, dtype=int), array))
    print('array being modified inside the loop', array)
print('final arr01', arr01)

【讨论】:

  • OP 的版本将array 制作为numpy.ndarray 对象,但array[:] 将其保留为list 对象,这可能是一个意外的副作用,并且需要其他人记住。
  • 出色的答案。这么小的改动就彻底解决了问题!
  • 快速更新...我意识到当我输入 numpy 数组而不是列表时,我不得不采用 PyNoob 和 Saritus 共同提出的其他解决方案,如下所示:arraylist = [arr01, arr02 , arr99] for i in range(len(arraylist)): arraylist[i] = np.concatenate((np.zeros(3, dtype=int), arraylist[i])) print('数组在循环内被修改', arraylist[i]) arr01, arr02, arr99 = arraylist
猜你喜欢
  • 2023-03-25
  • 2017-08-02
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多