【发布时间】:2018-04-30 14:26:48
【问题描述】:
这个问题与很多与警告RuntimeWarning: invalid value encountered in greater/less/etc相关的问题非常相似
但是,我找不到针对我的特定问题的解决方案,我认为应该有一个解决方案。
所以,我有一个类似于这个的numpy.ndarray:
array([[ nan, 1., nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
...,
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan],
[ nan, nan, nan, ..., nan, nan, nan]])
我想计算array > 0.5,它给出了我想要的结果,但警告与nan进行比较:
__main__:1: RuntimeWarning: invalid value encountered in greater
Out[68]:
array([[False, True, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]], dtype=bool)
我基本上想计算array > 0.5,但没有出现警告。
我的限制:
- 我确实 不 只想用
with np.errstate(invalid='ignore'):抑制警告 - 我需要维护原始数组,因此无法更改。
我想出了一个简单的解决方案:
- 更改原始矩阵 (
array[np.isnan(array)] = -np.inf) 中的nan,在我进行比较后将其恢复 (array[array == -np.inf] = np.nan)
但我认为,当(我认为)应该存在一种直接的方式来立即执行此操作时,所有这些计算只是浪费时间。我一直在探索numpy.ma 模块和numpy.where 函数,但是我找不到我想要的这种“直接”解决方案。
对此有什么想法吗?
【问题讨论】:
-
制作比较函数 (value != nan) 和 (value > 0.5)
-
@AlexvonBrandenfels 您的解决方案不起作用。首先,我必须将
nan更改为numpy.nan。但即使在那之后我还是有一个错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() -
“我不想仅仅取消警告” - 为什么不呢?
-
@user2357112 因为我不认为这是正确的。我正在以 3 值逻辑进行比较,因此实际上将 NaN 与其他值进行比较的结果可能是错误的或其他值。在 numpy 的未来版本中,这个结果可能会改变,因此我想确保我总是有一个预期的结果
-
“在 numpy 的未来版本中,这个结果可能会改变”——这种情况极不可能发生,如果发生了,无论如何你都必须重新考虑所有的 NaN 处理。
标签: python-3.x numpy