nan: not a number
inf: 无穷大
xarray的DataArray的求和求平均函数会自动忽略 nan。但若有 inf,则求和与求平均的结果都是 inf。
numpy中大多数函数都不会忽略 nan 和 inf。若数组中有 nan 和 inf, 求和求平均的结果都是 nan or inf。举例如下
运算函数
a = np.array([1,2,3,np.nan,4,5])
print('%f, %f'%(a.min(),a.max())) # 结果为 nan,nan
print('%f, %f'%(np.nanmin(a),np.nanmax(a))) # 结果为1,5
print('%f, %f'%(a.sum(),a.mean())) # 结果也是 nan,nan
print('%f, %f'%(np.nansum(a),np.nanmean(a))) # 结果为 15, 3
a = np.array([1,2,np.nan,np.inf,4,5])
print('%f, %f'%(a.min(),a.max())) # 结果为 nan,nan
print('%f, %f'%(np.nanmin(a),np.nanmax(a))) # 结果 1, inf
print('%f, %f'%(a.sum(),a.mean())) # 结果 nan,nan
print('%f, %f'%(np.nansum(a),np.nanmean(a))) # 结果 inf, inf
a = np.array([1,2,3,6,4,5])
a = np.ma.array(a,mask=(a==5)) # 结果 [1.0 2.0 3.0 6.0 4.0 --]
print('%f, %f'%(a.sum(),a.mean())) # 结果 16.000000, 3.200000
print('%f, %f'%(np.nansum(a),np.nanmean(a))) # 结果同上
# 使用scipy.stats.计算相关系数时,不能有缺测存在,因此需要替换缺测
# 可以自己指定将nan,np.inf替换为某个具体数值,或者使用默认的数值
new = np.nan_to_num(a, nan=0, posinf=999, neginf=-999)
np.sqrt(a), 若a是实数且a中有负数,则负数的计算值为nan,若a是复数且有负数,则负数的计算结果为复数
设置缺测 masking
a = np.array([1,2,np.nan,np.inf,4,5])
b = np.ma.array(a,mask=(a==4))
# 得到的b是
# masked_array(data=[1.0, 2.0, nan, inf, --, 5.0],
# mask=[False, False, False, False, True, False],
# fill_value=1e+20)
da = xr.DataArray(np.arange(16).reshape(4, 4), dims=["x", "y"])
da.where(da.x + da.y < 4) # 保留满足条件的变量,未满足条件的变量设为nan
# da.where(da.x + da.y < 4,0),会将未满足条件的变量设为0
# output is
# <xarray.DataArray (x: 4, y: 4)>
# array([[ 0., 1., 2., 3.],
# [ 4., 5., 6., nan],
# [ 8., 9., nan, nan],
# [12., nan, nan, nan]])
# Dimensions without coordinates: x, y