RQL's Blog 菜鸟成长记

python中的nan和inf

2022-07-26
renql

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

支持 支付宝鼓励 鸡腿鸡腿

喜欢此文!

Similar Posts