【问题标题】:Conditionals on one numpy array while iterating over a second numpy array迭代第二个 numpy 数组时对一个 numpy 数组的条件
【发布时间】:2018-03-13 22:50:43
【问题描述】:

我通读了 numpy 文档,尤其是关于在 for 循环中迭代 ndarray 的内容。通读建议的类似 S.O.帖子,但我仍然无法解决看似相对简单的问题。

我想合并基于一个 ndarray 值的条件,同时以元素方式迭代不同的 ndarray。这是我的代码:

import numpy as np
array1 = np.array([10,20,30,40,50])
array2 = np.array([-1,-1,1,0,1])
for x in np.nditer(array1,flags=['refs_ok']):
    if array2[x] < 0:
       #code-block here executing several tasks

关于 if 语句,我收到以下错误:“IndexError:索引 10 超出轴 0 的范围,大小为 5”。

代码块必须以时间序列方式执行,因此是 for 循环。不知道发生了什么。

【问题讨论】:

  • nditer 不适合初学者。如果必须迭代,请使用纯 Python 循环(i 在范围内...)。
  • 好建议,谢谢

标签: python arrays numpy for-loop iteration


【解决方案1】:

您目前得到IndexErrornp.nditer 的原因是因为该函数正在迭代array1 中的items 而不是indices .由于第一项是10,因此您正在尝试访问array2[10]

快速的方法是使用条件索引,而不是for 循环。例如,如果你想对 array2 小于 0 的地方应用某个函数 farray1,而对所有其他地方应用另一个函数 g,假设 fg 被写入输入并返回 numpy 数组,你会写

array1[array2 < 0] = f(array1[array2 < 0])
array1[array2 >= 0] = g(array1[array2 >= 0])

这将比使用 for 循环运行得更快,因为迭代发生在 C 级别而不是 Python 中。您可以使用这种形式编写几乎任何一组元素操作,而无需 for 循环。

【讨论】:

  • 啊,当然——我自己应该看到的。很好的建议:条件索引杰里米。再次感谢。
  • 以下似乎也有效:for idx, x in enumerate(array1): if array2[idx]
  • 是的,这行得通!但是,如果您打算使用大型数组(尤其是多维数组),我强烈建议您使用条件索引。它阅读起来更清晰,执行起来也更快。如果我已经回答了您的问题,请将其标记为已回答!如果没有,请告诉我缺少什么。
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 2011-12-28
  • 2021-06-02
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2019-04-26
相关资源
最近更新 更多