更大 - numpy数组逻辑中遇到的值无效

时间:2017-11-16 13:32:42

标签: python numpy boolean-logic short-circuiting

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

(1)in

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

2 个答案:

答案 0 :(得分:1)

这可以做到这一点,使用一些布尔索引来避免nanwhere语句

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

答案 1 :(得分:0)

好的:好像我自己找到了一个解决方案:

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

似乎有效。参考:[1]