使用np.meshgrid生成DataFrame后,子集筛选末尾经度值失败排查
问题原因及解决办法
这是浮点数精度误差导致的问题。
具体原因
np.arange是通过起始值不断累加步长1e-4来生成序列的,但浮点数在二进制存储中无法精确表示所有十进制小数,累加过程中会产生微小的精度偏差。你以为的末尾经度值89.7788,实际上生成的最后一个经度值并不是这个精确数,而是一个非常接近它的近似值(比如89.77879999999999这类)。直接用==做精确匹配自然找不到结果。
你可以打印a[-5:]查看实际生成的末尾几个值,就能直观看到这种偏差:
print(a[-5:])
解决办法
有几种常用的处理方式:
- 用
np.isclose做近似匹配,允许一定的误差范围:len(np_df[np.isclose(np_df['lon'], 89.7788, atol=1e-8)]) - 对经度值进行四舍五入,保留固定小数位数后再匹配:
len(np_df[np.round(np_df['lon'], 4) == 89.7788]) - 改用
np.linspace生成序列,它会直接计算起始和结束值之间的等分点,避免累加误差:# 计算步数:(89.7788 - 89.7664)/1e-4 = 124,所以生成125个点(包含首尾) a = np.linspace(89.7664, 89.7788, num=125) b = np.linspace(20.6897, 20.7049, num=153)
内容的提问来源于stack exchange,提问作者d_frEak
相关产品推荐
相关产品推荐

