使用masked array绘制hist2D时掩码零值触发ValueError求助
解决hist2d处理masked_array时的NaN转整数错误
我来帮你搞定这个问题!你碰到的ValueError: cannot convert float NaN to integer错误,根源在于matplotlib的hist2d函数并不原生支持numpy的masked_array类型。当你把masked_array传进去时,内部会自动把被mask的元素转成NaN,但在后续计算直方图的流程里,有个步骤会尝试把这些NaN转换成整数索引,这就触发了报错。
解决方案:提取有效数据后再传入hist2d
正确的做法是先把masked_array里的有效(未被mask)数据提取出来,用masked_array自带的compressed()方法就能轻松做到——它会返回一个去掉所有被mask元素的一维数组,完全符合hist2d的要求。
修改后的代码如下:
import numpy.ma as ma import matplotlib.pyplot as plt # 初始化masked数组 x = ma.masked_array([0.17478785046728973, 0.21854713940370668, 0.7354304690743048, 1.1052309124767226, 0.3450562200956937, 0]) x[5] = ma.masked # 简化标记mask的方式,和ma.masked_all(1)效果一致 y = ma.masked_array([0.17478785046728973, 0.21854713940370668, 0.7354304690743048, 1.1052309124767226, 0.3450562200956937, 0]) y[5] = ma.masked # 提取未被mask的有效数据 x_valid = x.compressed() y_valid = y.compressed() # 绘制二维直方图 plt.hist2d(x_valid, y_valid, bins=10) plt.colorbar() # 建议加上颜色条,方便查看每个区间的计数 plt.show()
额外说明
compressed()方法会自动过滤掉所有被标记为mask的元素,确保传入hist2d的是没有NaN的普通numpy数组,从根源上避免了类型转换错误。- 你原来用的
x[5] = ma.masked_all(1)可以简化为x[5] = ma.masked,两者都能把该位置标记为masked,后者写法更简洁直观。
内容的提问来源于stack exchange,提问作者Ben Pickering
相关产品推荐
相关产品推荐

