【问题标题】:How do I convert list (whose elements are arrays) into JSON serializable list?如何将列表(其元素是数组)转换为 JSON 可序列化列表?
【发布时间】:2021-11-22 23:26:29
【问题描述】:

我必须将一个列表(其元素是数组)转换为列表。打印出来的内容如下:

[
array([[100.1, 120.4, 156.4, 458.5, 0.99]], dtype=float32), 
array([[120.3, 168.9, 169.3, 770.2, 0.89]], dtype=float32), 
array([[850.1, 671.5, 222.1, 563.4, 0.88]], dtype=float32)
]

我需要的是一些可以 json 序列化的列表。 因为当我使用 json.dump 时,它会返回:

TypeError: Object of type ndarray is not JSON serializable

我知道它仍然是列表,但以数组作为其元素。如何正确转换?

【问题讨论】:

标签: python arrays json serialization


【解决方案1】:

@Dani 和 @Jonathan1609 指出,json.dump 不适用于 NumPy 数组。

要使用json.dump,您必须将所有数组转换为python 列表,然后调用json.dump

l = [
array([[100.1, 120.4, 156.4, 458.5, 0.99]], dtype=float32), 
array([[120.3, 168.9, 169.3, 770.2, 0.89]], dtype=float32), 
array([[850.1, 671.5, 222.1, 563.4, 0.88]], dtype=float32)
]
l = [i.tolist() for in l]
json.dump(l)

如果您不想更改数据类型,也可以编写自己的序列化程序。

import json
import numpy as np

class NumpyEncoder(json.JSONEncoder):
    """ Special json encoder for numpy types """
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

dumped = json.dump(l, cls=NumpyEncoder)

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多