如何将混合numpy与Python类型的嵌套对象转换为JSON兼容原生Python类型
混合Python与numpy类型的深层嵌套对象原生类型转换方案
实现思路
递归遍历嵌套对象的所有层级,针对不同类型做对应转换,全程在内存中完成,无需额外的JSON序列化/反序列化往返操作:
- 支持dict、list、tuple等常见Python容器类型的递归遍历
- numpy标量(如np.int64、np.float32、np.bool_等)调用
.item()转为原生Python标量 - numpy数组调用
.tolist()转为列表后再递归处理内部元素 - 原生Python类型直接返回,不做多余处理
完整实现代码
import numpy as np from collections.abc import Mapping, Iterable def numpy_to_native(obj): # 处理numpy标量类型 if isinstance(obj, np.generic): return obj.item() # 处理numpy数组类型 elif isinstance(obj, np.ndarray): return numpy_to_native(obj.tolist()) # 处理字典类容器 elif isinstance(obj, Mapping): return {key: numpy_to_native(value) for key, value in obj.items()} # 处理可迭代非字符串/字节类容器(列表、元组等) elif isinstance(obj, Iterable) and not isinstance(obj, (str, bytes)): return [numpy_to_native(item) for item in obj] # 其他原生Python类型直接返回 else: return obj
使用示例
# 测试用深层混合类型对象 test_obj = { "level1": { "numpy_int": np.int64(2024), "numpy_array": np.array([1, 2, np.float32(3.1415)]), "nested_list": [np.bool_(False), "原生字符串", 789, (np.uint8(255), 101112)] } } # 转换后得到全原生Python类型对象 native_obj = numpy_to_native(test_obj) # 转换后的对象可直接传入任意标准json.dumps方法使用
方案优势
- 性能优于两次JSON往返的方案,所有转换操作仅在内存中完成
- 全递归实现,支持任意深度的嵌套结构,numpy类型无论出现在哪一层都能被正确转换
- 不侵入现有序列化逻辑,转换产物完全兼容标准JSON序列化规则
内容的提问来源于stack exchange,提问作者Peter Cotton
相关产品推荐
相关产品推荐

