当前位置: 首页 > 面试题库 >

用于复杂numpy数组的Json编码器和解码器

周和志
2023-03-14
问题内容

我正在尝试对复杂的numpy数组进行JSON编码,并且我从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]]}

你们可以帮我弄清楚覆盖加载/解码的方法,以便推断出它必须是一个复杂的数组吗?IE而不是2元素项的列表,它应该只是将它们放回复杂的数组中。JsonCustomDecoder没有default()覆盖的方法,而编码文档对我来说术语太多。


问题答案:

这是我根据hpaulj的回答以及他对此线程的回答改编而成的最终解决方案:https
://stackoverflow.com/a/24375113/901925

这将对嵌套在任何数据类型的字典中任意深度的数组进行编码/解码。

import base64
import json
import numpy as np

class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        """
        if input object is a ndarray it will be converted into a dict holding dtype, shape and the data base64 encoded
        """
        if isinstance(obj, np.ndarray):
            data_b64 = base64.b64encode(obj.data)
            return dict(__ndarray__=data_b64,
                        dtype=str(obj.dtype),
                        shape=obj.shape)
        # Let the base class default method raise the TypeError
        return json.JSONEncoder(self, obj)


def json_numpy_obj_hook(dct):
    """
    Decodes a previously encoded numpy ndarray
    with proper shape and dtype
    :param dct: (dict) json encoded ndarray
    :return: (ndarray) if input was an encoded ndarray
    """
    if isinstance(dct, dict) and '__ndarray__' in dct:
        data = base64.b64decode(dct['__ndarray__'])
        return np.frombuffer(data, dct['dtype']).reshape(dct['shape'])
    return dct

# Overload dump/load to default use this behavior.
def dumps(*args, **kwargs):
    kwargs.setdefault('cls', NumpyEncoder)
    return json.dumps(*args, **kwargs)

def loads(*args, **kwargs):
    kwargs.setdefault('object_hook', json_numpy_obj_hook)    
    return json.loads(*args, **kwargs)

def dump(*args, **kwargs):
    kwargs.setdefault('cls', NumpyEncoder)
    return json.dump(*args, **kwargs)

def load(*args, **kwargs):
    kwargs.setdefault('object_hook', json_numpy_obj_hook)
    return json.load(*args, **kwargs)

if __name__ == '__main__':

    data = np.arange(3, dtype=np.complex)

    one_level = {'level1': data, 'foo':'bar'}
    two_level = {'level2': one_level}

    dumped = dumps(two_level)
    result = loads(dumped)

    print '\noriginal data', data
    print '\nnested dict of dict complex array', two_level
    print '\ndecoded nested data', result

产生输出:

original data [ 0.+0.j  1.+0.j  2.+0.j]

nested dict of dict complex array {'level2': {'level1': array([ 0.+0.j,  1.+0.j,  2.+0.j]), 'foo': 'bar'}}

decoded nested data {u'level2': {u'level1': array([ 0.+0.j,  1.+0.j,  2.+0.j]), u'foo': u'bar'}}


 类似资料:
  • 我最近刚开始使用API和http请求,我正试图构建一个应用程序,使用Reddit API在特定的子编辑上拉帖子。 这是我正在练习的带有json和搜索参数的页面:https://www.reddit.com/r/hiphopheads.json?limit=1 查看Golang的JSON模块的标准库,我仍然不知道如何使用JSON。解组此复杂JSON。根据我收集到的信息,我必须定义一个类似于JSON结

  • 问题内容: Android中是否存在用于String的base-64解码器和编码器? 问题答案: 看到 似乎这是在API版本8或android 2.2中添加的,因此在较旧的平台上将不可用。 但是它的来源是这样,如果需要的话,可以将其原样复制为旧版本。

  • Netty 的是一个复杂和先进的框架,但它并不玄幻。当我们请求一些设置了 key 的给定值时,我们知道 Request 类的一个实例被创建来代表这个请求。但 Netty 并不知道 Request 对象是如何转成 Memcached 所期望的。Memcached 所期望的是字节序列;忽略使用的协议,数据在网络上传输永远是字节序列。 将 Request 对象转为 Memcached 所需的字节序列,N

  • 错误:错误:(49,9)找不到存储在数据集中的类型的编码器。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。_在以后的版本中将增加对序列化其他类型的支持。.map(msg=>{

  • 问题内容: 我有一些json,我需要解码,更改然后编码,而不会弄乱任何字符。 如果我在json字符串中包含unicode字符,它将无法解码。我不知道为什么,因为json.org说一个字符串可以包含:。但这在python中也不起作用。 我可以使用utf8_encode,该字符串将允许使用json_decode对字符串进行解码,但是字符会被压缩成其他形式。这是来自结果数组的print_r的结果。两个字

  • 问题内容: 我有一个用于ERP系统的快速开发工具,该工具仅允许使用vbscript。我正在尝试使用VBS创建一个简单的AJAX请求。可以使用“ Microsoft.XMLHTTP”对象。 下一步是使用json从网络服务器接收数据。但是在VBS中似乎没有像“ json_decode”或其他功能。 有人知道解决方案吗?还是开发自己的json函数的唯一选择? 问题答案: 由于JSON是一种分层数据格式,