Python Numpy面具NaN无法正常工作

chr*_*ris 8 python numpy

我只是想使用一个蒙面数组来过滤掉一些nan条目.

import numpy as np
# x = [nan, -0.35, nan]
x = np.ma.masked_equal(x, np.nan)
print x
Run Code Online (Sandbox Code Playgroud)

这输出如下:

masked_array(data = [        nan -0.33557216         nan],
         mask = False,
   fill_value = nan)
Run Code Online (Sandbox Code Playgroud)

调用np.isnan()x返回正确的布尔数组,但面具似乎并不工作.为什么我的面具不能像我期望的那样工作?

ali*_*i_m 10

你可以使用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)
Run Code Online (Sandbox Code Playgroud)

或者,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)
Run Code Online (Sandbox Code Playgroud)

为什么原始方法不起作用?因为,相反违反直觉,NaN不等于NaN!

print(np.nan == np.nan)
# False
Run Code Online (Sandbox Code Playgroud)

这实际上是IEEE-754定义的一部分NaN


chu*_*iti 6

这是不使用掩码的另一种选择:

import numpy as np
#x = [nan, -0.35, nan]
xmask=x[np.logical_not(np.isnan(x))]
print(xmask)
Run Code Online (Sandbox Code Playgroud)

结果:

array([-0.35])

  • 对于任何想知道的人来说,这里需要“np.logic_not”而不是内置的“not”,因为后者不广播。 (2认同)