You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置-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类型转换规则不允许将浮点计算结果自动强转为整型数组,因此触发类型转换报错。
修复方案
  1. 修正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])
    }
  1. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:27:32