【问题标题】:Updating multiple elements in numpy array without loops在没有循环的情况下更新numpy数组中的多个元素
【发布时间】:2023-03-25 18:10:01
【问题描述】:

我有一个 numpy 数组,例如

original_array=np.arange(5)

我有另一个数组来存储要更新的索引值

indices=[0,1,2,1,1]

indices 元素中的重复表示该元素被多次更新。

我还有存储要添加的值的数组。

updation_values=[0.2,0.2,0.4, 0.5, 0.4]

通常我将数组更新为

for update_value, index in zip(updation_values, indices):
    original_array[index]+=update_value

除了循环还有更好的方法吗?

original_array[indices]+=updation_values

似乎不起作用,因为它只更新每个唯一索引的最后一个实例。

【问题讨论】:

  • 查找 np.add.at - 在文档或 SO
  • 谢谢@hpaulj,当我们尝试添加矩阵而不仅仅是数字时,我无法理解这里的可广播性意味着什么。

标签: python arrays python-3.x numpy


【解决方案1】:

你的问题有两个:

  1. 为什么它没有按预期工作?

  2. 如何让它更快?

为什么它不起作用?

您正在创建整数 ndarray - 这意味着小数更新会四舍五入到最接近的整数,并且由于更新

original_array=np.arange(5)#, dtype=np.float)
indices=[0,1,2,1,1]
updation_values=[0.2,0.2,0.4, 0.5, 0.4]
updation_values=[1,1,1,1,1]

for update_value, index in zip(updation_values, indices):
    original_array[index] += update_value

print(original_array)

[1 4 3 3 4]

为确保您使用浮点数创建 ndarray,您必须使用 dtype 可选参数:

original_array=np.arange(5, dtype=np.float)

如何让它更快?

通常,您希望使用 NumPy 向量化。不幸的是,您的 indices 变量中有重复,所以:

original_array[indices]+=updation_values

不会工作。

你可以看到自己:

print(original_array)
original_array[[0,1,2]] += 10
print(original_aray)

结果:

[1 4 3 3 4]

[11 14 13 3 4]

也是如此:

original_array[[0,1,2,0,0]] += 10

【讨论】:

  • 我尝试过使用整数值。它不起作用。我做了updation_values = [1,1,1,1,1],我得到的最终结果是original_array=[1,2,3,3,4]而不是original_array=[1,4,3,3,4]
  • 它对我有用:[1 4 3 3 4]
  • 确实如此。并没有什么意外。如果您在 Jupyter 笔记本中运行它 - 重新启动 Python 会话并从头开始重新启动更改。
  • 我对循环很满意,而且我知道它有效。我的问题是如何让它更快。使用第二种方法,original_array[indices]+=updation_values 它不起作用。我知道为什么它不起作用,但我该怎么做。请注意循环和向量代码块的区别。
  • 对,没有解决这个问题。我认为您不能这样做,因为您在 indices 变量中重复了索引。
猜你喜欢
  • 2017-03-25
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2021-11-12
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多