NumPy 类型不能直接序列化为 JSON。JSON 只支持以下数据类型:
None
转换为null
bool
转换为true
或false
int
转换为 JSON 的数字float
转换为 JSON 的数字str
转换为 JSON 的字符串list
转换为 JSON 的数组dict
转换为 JSON 的对象
而 NumPy 提供了许多额外的数据类型(如 np.int32
、np.float64
、np.ndarray
等),这些类型并不是 JSON 的原生支持类型,因此需要进行转换。
解决方法
为了将包含 NumPy 类型的数据序列化为 JSON,可以使用以下两种方法:
方法 1:使用自定义的 JSON 编码器
定义一个自定义的 JSON 编码器,处理 NumPy 类型的转换。
import json
import numpy as np
class NumpyJSONEncoder(json.JSONEncoder):
"""处理numpy类型的JSON编码器"""
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
if isinstance(obj, np.floating):
return float(obj)
if isinstance(obj, np.ndarray):
return obj.tolist()
return super().default(obj)
# 示例数据,包含 NumPy 类型
data = {
"integer": np.int32(42),
"float": np.float64(3.14),
"array": np.array([1, 2, 3])
}
# 使用自定义编码器进行序列化
json_str = json.dumps(data, cls=NumpyJSONEncoder)
print(json_str)
# 输出:{"integer": 42, "float": 3.14, "array": [1, 2, 3]}
方法 2:递归转换数据结构中的 NumPy 类型
使用一个递归函数将嵌套数据结构中的 NumPy 类型转换为标准 Python 类型。
import numpy as np
def convert_numpy_types(obj):
"""递归转换字典中的numpy类型"""
if isinstance(obj, dict):
return {key: convert_numpy_types(value) for key, value in obj.items()}
elif isinstance(obj, list):
return [convert_numpy_types(item) for item in obj]
elif isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
return obj
# 示例数据,包含嵌套的 NumPy 类型
data = {
"integer": np.int32(42),
"float": np.float64(3.14),
"array": np.array([1, 2, 3]),
"nested": {
"array_list": [np.array([4, 5, 6]), np.int64(7)],
"float_list": [np.float32(1.1), np.float64(2.2)]
}
}
# 转换 NumPy 类型
converted_data = convert_numpy_types(data)
# 序列化为 JSON
import json
json_str = json.dumps(converted_data)
print(json_str)
# 输出:{"integer": 42, "float": 3.14, "array": [1, 2, 3], "nested": {"array_list": [4, 5, 6, 7], "float_list": [1.1, 2.2]}}
总结
- 直接序列化:NumPy 类型不能直接序列化为 JSON。
- 解决方法:使用自定义的 JSON 编码器或递归转换函数,将 NumPy 类型转换为标准 Python 类型后再进行序列化。
- 适用场景:如果你的数据结构中包含 NumPy 类型(如
np.int32
、np.float64
、np.ndarray
等),需要在序列化之前进行转换。