我只是试图使用带掩码的数组来过滤掉一些nan条目。

import numpy as np
# x = [nan, -0.35, nan]
x = np.ma.masked_equal(x, np.nan)
print x

这将输出以下内容:
masked_array(data = [        nan -0.33557216         nan],
         mask = False,
   fill_value = nan)

np.isnan()上调用x返回正确的 bool 数组,但是掩码似乎不起作用。为什么我的口罩不能按我预期的那样工作?

最佳答案

您可以使用 np.ma.masked_invalid :

import numpy as np

x = [np.nan, 3.14, np.nan]
mx = np.ma.masked_invalid(x)

print(repr(mx))
# masked_array(data = [-- 3.14 --],
#              mask = [ True False  True],
#        fill_value = 1e+20)

或者,将np.isnan(x)用作mask=np.ma.masked_array参数:
print(repr(np.ma.masked_array(x, np.isnan(x))))
# masked_array(data = [-- 3.14 --],
#              mask = [ True False  True],
#        fill_value = 1e+20)

为什么您的原始方法不起作用?因为,与直觉相反,NaN不等于NaN!
print(np.nan == np.nan)
# False

这实际上是part of the IEEE-754 definition of NaN

10-01 05:42
查看更多