问题“为什么我得到一个无效的价值......”已经讨论过几次了。这是另一个我还不太了解的变体 - 这就是我打开这个帖子的原因:
(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
答案 0 :(得分:1)
这可以做到这一点,使用一些布尔索引来避免nan
和where
语句
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]