使用numpy的ma模块处理nan值
我不太明白这个 numpy.ma.max
(还有最小值、平均值等等)的行为。
import numpy as np
arr = np.ma.array([0,np.nan,1])
np.ma.max(arr)
-> nan
我以为这个函数应该返回一个不包含 nan
的值?我唯一能得到真实值的方法是
np.nanmax(np.asarray(arr))
这样做对吗,还是我用 numpy.ma.max
的方式不对?
2 个回答
1
创建掩码的一个简单方法是使用 np.ma.masked_invalid 函数(可以查看这个链接了解更多信息:http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.masked_invalid.html#numpy.ma.masked_invalid)
下面是一个例子:
# Makes example reproducible
np.random.seed(seed=1337)
# Generate some data
X = np.random.random((5,5))
X[X > .5] = np.nan
print X
array([[ 0.26202468, 0.15868397, 0.27812652, 0.45931689, 0.32100054],
[ nan, 0.26194293, nan, nan, 0.11527423],
[ 0.38627507, nan, 0.12505793, nan, 0.44322487],
[ nan, nan, 0.36126157, 0.41610394, nan],
[ nan, 0.18780841, 0.28816715, nan, 0.49964826]])
# Mask will hide both np.nan and np.inf values
masked_X = np.ma.masked_invalid(X, copy=False)
# Voila
print np.max(masked_X, axis=0)
masked_array(data = [0.38627506863435945 0.26194292556514465 0.36126157241743073
0.45931688721456665 0.49964826137201246],
mask = [False False False False False],
fill_value = 1e+20)
2
你需要创建一个遮罩:
import numpy as np
arr = np.ma.array([0,np.nan,1])
print(np.ma.max(arr))
# >>>nan # since there is no mask
marr = np.ma.masked_array([0,np.nan,1], np.isnan(arr))
print(np.ma.max(marr))
# >>>1.0 # since the mask tells mask to ignore the nan. The max of the rest (0,1) is 1.