在 greater - numpy 数组逻辑中遇到无效值
Invalid value encountered in greater - numpy array logic
问题 "Why do I get an invalid value ..." 已经讨论过几次了。这是另一个我不太明白的变体 - 这就是我打开这个线程的原因:
(1) 在
y = np.nan
(~np.isnan(y)) & (y > 5.)
我得到了正确的结果,没有抛出任何错误。
(2) 然而,在
y = np.array([np.isnan, 6.])
(~np.isnan(y)) & (y > 5.)
显示 "Invalid value encountered in greater" 警告。
这意味着如果此表达式与 numpy 数组一起使用,布尔值和表达式中的短路 (Python reference) 将不起作用。
在 Whosebug(例如 ref )和其他地方进行一些挖掘,似乎在引擎盖下数组表达式被写为
np.logical_and.reduce([~np.isnan(y), y>5.])
这意味着两个表达式在组合之前首先针对所有元素求值(实际上,这会产生相同的警告)。有人可以确认这是正在发生的事情吗?除了遍历所有数组元素之外,还有人有解决这个问题的方法吗?
我在其中使用此表达式的上下文是将数组中的其他值设置为 nan,如果它们超过阈值,即实际代码类似于
y[(~np.isnan(y)) & (y > 5.)] = np.nan
好的:看来我自己找到了解决办法:
array_and = np.frompyfunc(lambda x: (~np.isnan(x)) & (x > 5.), 1, 1)
array_and(y)
似乎有效。参考:[1]
这可以做到,使用一些布尔索引来避免 nan
和 where
语句
y[np.isfinite(y)] = np.where(y[np.isfinite(y)] > 5, np.nan, y[np.isfinite(y)])
问题 "Why do I get an invalid value ..." 已经讨论过几次了。这是另一个我不太明白的变体 - 这就是我打开这个线程的原因:
(1) 在
y = np.nan
(~np.isnan(y)) & (y > 5.)
我得到了正确的结果,没有抛出任何错误。
(2) 然而,在
y = np.array([np.isnan, 6.])
(~np.isnan(y)) & (y > 5.)
显示 "Invalid value encountered in greater" 警告。
这意味着如果此表达式与 numpy 数组一起使用,布尔值和表达式中的短路 (Python reference) 将不起作用。
在 Whosebug(例如 ref )和其他地方进行一些挖掘,似乎在引擎盖下数组表达式被写为
np.logical_and.reduce([~np.isnan(y), y>5.])
这意味着两个表达式在组合之前首先针对所有元素求值(实际上,这会产生相同的警告)。有人可以确认这是正在发生的事情吗?除了遍历所有数组元素之外,还有人有解决这个问题的方法吗?
我在其中使用此表达式的上下文是将数组中的其他值设置为 nan,如果它们超过阈值,即实际代码类似于
y[(~np.isnan(y)) & (y > 5.)] = np.nan
好的:看来我自己找到了解决办法:
array_and = np.frompyfunc(lambda x: (~np.isnan(x)) & (x > 5.), 1, 1)
array_and(y)
似乎有效。参考:[1]
这可以做到,使用一些布尔索引来避免 nan
和 where
语句
y[np.isfinite(y)] = np.where(y[np.isfinite(y)] > 5, np.nan, y[np.isfinite(y)])