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

嵌套列表转numpy数组后JSON序列化报错的解决方法求助

解决嵌套列表转JSON序列化的问题

问题根源

  1. 尝试1的错误原因:pvTreatment是形状不均匀的嵌套列表(比如子列表长度不一致),无法直接转换为同构的float64类型numpy数组,因此触发ValueError。
  2. 尝试2的错误原因:用object类型创建numpy数组后,列表中仍保留numpy原生的float32对象,而Flask的jsonify默认不支持序列化numpy数值类型,因此触发TypeError。

解决方案

直接递归遍历嵌套列表,将所有numpy原生数值类型转换为Python原生类型,跳过numpy数组中转步骤:

  1. 定义类型转换函数:
def convert_numpy_to_python(obj):
    if isinstance(obj, list):
        return [convert_numpy_to_python(item) for item in obj]
    elif isinstance(obj, np.generic):
        # 将numpy的float32/int64等类型转为Python原生数值
        return obj.item()
    else:
        return obj
  1. 处理目标字段并构建结果字典:
resultsDict = {
    "extras": {
        "pvTreatment": convert_numpy_to_python(pvTreatment),
        # 其他需要处理的字段同理
    }
}
  1. 直接返回jsonify(resultsDict)即可,此时所有元素都是Python原生可序列化类型,且保留了原嵌套列表的不均匀结构。

替代方案(可选)

如果需要保留numpy数组处理流程,可以先将嵌套列表转为object类型数组,再遍历转换每个元素的类型:

pv_array = np.array(pvTreatment, dtype=object)
# 遍历数组转换所有numpy数值类型
pv_processed = [[float(item) if isinstance(item, np.float32) else item for item in sublist] for sublist in pv_array.tolist()]

resultsDict = {
    "extras": {
        "pvTreatment": pv_processed,
        # 其他字段
    }
}

不过这种方式仅适用于固定层级的嵌套列表,递归函数的通用性更强。

内容的提问来源于stack exchange,提问作者Amrmsmb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:55:42