Numpy MaskedArray无法将fill_value设置为np.nan的问题求助
解决复数MaskedArray计算后实数数组fill_value无法设为np.nan的问题
问题本质
你遇到的问题是:np.ma.angle返回的MaskedArray虽然数据是浮点型,但fill_value的类型被继承自原始复数数组的类型,导致手动设置np.nan时会被自动转为复数形式(nan+0j),进而触发后续的ComplexWarnings。
两种可行解决方法
方法1:重新构造MaskedArray
直接基于计算得到的结果和掩码,创建一个新的浮点型MaskedArray,显式指定fill_value为np.nan:
import numpy as np ma1 = np.ma.MaskedArray([1.1+1j, 2.2-1j]) ma2 = np.ma.MaskedArray([2.2+1j, 3.3+1j]) ma1.fill_value = np.nan + np.nan*1j ma2.fill_value = np.nan + np.nan*1j # 先计算原始结果 raw_ang = np.ma.angle(ma1/ma2, deg=True) # 重新构造浮点型MaskedArray ang = np.ma.MaskedArray(raw_ang.data, mask=raw_ang.mask, fill_value=np.nan) print(ang.fill_value) # 输出 nan print(type(ang.fill_value)) # 输出 <class 'numpy.float64'>
方法2:转换数组数据类型后设置fill_value
先将数组转换为浮点型,再设置fill_value,此时fill_value会被正确识别为浮点型:
import numpy as np ma1 = np.ma.MaskedArray([1.1+1j, 2.2-1j]) ma2 = np.ma.MaskedArray([2.2+1j, 3.3+1j]) ma1.fill_value = np.nan + np.nan*1j ma2.fill_value = np.nan + np.nan*1j ang = np.ma.angle(ma1/ma2, deg=True) # 转换为浮点型数组 ang = ang.astype(np.float64) # 设置fill_value ang.fill_value = np.nan print(ang.fill_value) # 输出 nan print(type(ang.fill_value)) # 输出 <class 'numpy.float64'>
补充说明
之所以会出现这个问题,是因为np.ma.angle在生成结果时,默认沿用了输入复数数组的fill_value类型,即使结果数据是浮点型,fill_value的类型仍被保留为复数。通过重新构造或转换数据类型,可以强制将fill_value的类型改为浮点型,避免后续的ComplexWarnings。
内容的提问来源于stack exchange,提问作者jbiz
相关产品推荐
相关产品推荐

