【问题标题】:Invalid value encountered in greater - numpy array logic在更大 - numpy 数组逻辑中遇到无效值
【发布时间】:2018-04-30 01:43:35
【问题描述】:

“为什么我得到一个无效值...”这个问题已经讨论过几次了。这是另一个我还不太了解的变体 - 这就是我打开这个帖子的原因:

(1) 在

y = np.nan
(~np.isnan(y)) & (y > 5.)

我得到了正确的结果并且没有抛出错误。

(2) 然而,在

y = np.array([np.isnan, 6.])
(~np.isnan(y)) & (y > 5.)

显示“在更大的值中遇到无效值”警告。

这意味着如果将此表达式与 numpy 数组一起使用,布尔和表达式中的短路 (Python reference) 将不起作用。

在stackoverflow(例如ref)和其他地方挖掘了一下,似乎在引擎盖下数组表达式被写成

np.logical_and.reduce([~np.isnan(y), y>5.])

这意味着两个表达式在组合之前首先针对所有元素进行评估(实际上,这会产生相同的警告)。有人可以确认这是正在发生的事情吗?除了循环遍历所有数组元素之外,还有没有人可以解决这个问题?

我使用这个表达式的上下文是如果数组中的附加值超过阈值,则将它们设置为 nan,即实际代码具有类似的东西

y[(~np.isnan(y)) & (y > 5.)] = np.nan

【问题讨论】:

  • y = np.array([np.isnan, 6.]) 应该是 y = np.array([np.nan, 6.]) 吗?
  • 标量 python 和短路。 Numpy & 没有。

标签: python numpy boolean-logic short-circuiting


【解决方案1】:

这可以做到,通过一些布尔索引来避免nanwhere 语句

y[np.isfinite(y)] = np.where(y[np.isfinite(y)] > 5, np.nan, y[np.isfinite(y)])

【讨论】:

    【解决方案2】:

    好的:看来我自己找到了解决方案:

    array_and = np.frompyfunc(lambda x: (~np.isnan(x)) & (x > 5.), 1, 1)
    array_and(y)
    

    似乎有效。参考:[1]

    【讨论】:

    • frompyfunc 仍然是一种迭代方法,但与更明确的 Python 循环相比,速度往往提高 2 倍。收益不大,但在难以构建或理解更高级的 numpy 方法时很有用。
    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多