使用numpy的ma模块处理nan值

1 投票
2 回答
1034 浏览
提问于 2025-04-17 05:07

我不太明白这个 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.

撰写回答