复杂numpy数组的Json编解码器

2024-05-16 03:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试JSON编码一个复杂的numpy数组,并且我已经从astropy(http://astropy.readthedocs.org/en/latest/_modules/astropy/utils/misc.html#JsonCustomEncoder)找到了一个用于此目的的实用程序:

import numpy as np

class JsonCustomEncoder(json.JSONEncoder):
    """ <cropped for brevity> """
    def default(self, obj):
        if isinstance(obj, (np.ndarray, np.number)):
            return obj.tolist()
        elif isinstance(obj, (complex, np.complex)):
            return [obj.real, obj.imag]
        elif isinstance(obj, set):
            return list(obj)
        elif isinstance(obj, bytes):  # pragma: py3
            return obj.decode()
        return json.JSONEncoder.default(self, obj)

这对于复杂的numpy数组很有效:

test = {'some_key':np.array([1+1j,2+5j, 3-4j])}

随着倾倒产生:

encoded = json.dumps(test, cls=JsonCustomEncoder)
print encoded
>>> {"some key": [[1.0, 1.0], [2.0, 5.0], [3.0, -4.0]]}

问题是,我无法将其自动读回复杂数组。例如:

json.loads(encoded)
>>> {"some_key": [[1.0, 1.0], [2.0, 5.0], [3.0, -4.0]]}

你们能帮我找出覆盖加载/解码的方法,从而推断出这一定是一个复杂的数组吗?一、 它不应该是一个包含2个元素的列表,而应该把它们放回一个复杂的数组中。JsonCustomDecoder没有要覆盖的default()方法,而且关于编码的文档对我来说有太多行话。


Tags: keynumpyjsonobjdefault编码returnnp