设置-90~90纬度地理网格触发Numpy UFuncTypeError报错排查
问题现象
构建固定纬度范围(-90°~+90°)的地图绘制网格数据时,运行代码触发如下报错:
numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'subtract' output from dtype('float64') to dtype('int32') with casting rule 'same_kind'
已定位报错触发行为extended_data = extend_data(base_data),测试发现如果将generate_grid函数中固定写死的latmax=90、latmin=-90替换为np.amin(data["lats"])、np.amax(data["lats"])则报错消失,但该方案无法满足固定纬度范围的需求。
原始问题代码
from traceback import print_tb import numpy as np import pandas as pd def get_data(): "lats": np.array([6.47, 4.8, 1.94 ]) "lons": np.array([46.37, 43.9, 47.83) "values": np.array([-29.5, -27.6, -32.5 ]) } def extend_data(data): return { "lons": np.concatenate([np.array([lon-360 for lon in data["lons"]]), data["lons"], np.array([lon+360 for lon in data["lons"]])]), "lats": np.concatenate([data["lats"], data["lats"], data["lats"]]), "values": np.concatenate([data["values"], data["values"], data["values"]]), } def generate_grid(data, basemap, delta=1): latmax = 90 latmin = -90 latmax = latmax.astype('float32') latmin = latmin.astype('float32') grid = { 'lon': np.arange(-180, 180, delta), 'lat': np.arange(latmin, latmax, delta) } grid["x"], grid["y"] = np.meshgrid(grid["lon"], grid["lat"]) grid["x"], grid["y"] = basemap(grid["x"], grid["y"]) return grid base_data = get_data() figure, axes, basemap = prepare_map_plot() grid = generate_grid(base_data, basemap, 1) extended_data = extend_data(base_data)
问题根因
- 代码存在基础语法错误:
get_data()函数缺失字典开头标识{与return关键字,lons数组的右中括号误写为右小括号,函数实际运行时返回None而非预期的结构化字典数据。 - 类型转换逻辑错误:
latmax=90、latmin=-90是Python原生整型值,本身不存在.astype()方法,这两行代码本身就会触发AttributeError;当使用np.amin(data["lats"])、np.amax(data["lats"])赋值时,返回值是numpy浮点型标量,自带.astype()方法,因此类型转换代码可以正常执行。 - 数组dtype不匹配:
np.arange在传入整型起止值、整型步长时,默认生成int32类型的数组,后续做浮点数减法运算时,numpy的same_kind类型转换规则不允许将浮点计算结果自动强转为整型数组,因此触发类型转换报错。
修复方案
- 修正
get_data函数的语法错误,补全返回结构:
def get_data(): return { "lats": np.array([6.47, 4.8, 1.94]), "lons": np.array([46.37, 43.9, 47.83]), "values": np.array([-29.5, -27.6, -32.5]) }
- 修正
generate_grid函数的类型逻辑,直接使用浮点型边界值,生成网格时显式指定数组dtype为浮点型,删除无效的原生int类型astype调用:
def generate_grid(data, basemap, delta=1): latmax = 90.0 latmin = -90.0 grid = { 'lon': np.arange(-180, 180, delta, dtype=np.float64), 'lat': np.arange(latmin, latmax, delta, dtype=np.float64) } grid["x"], grid["y"] = np.meshgrid(grid["lon"], grid["lat"]) grid["x"], grid["y"] = basemap(grid["x"], grid["y"]) return grid
修复后即可保留-90~90的固定纬度范围,同时不会触发类型报错。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

