这是我根据hpaulj的回答以及他对此线程的回答改编而成的最终解决方案:https
://stackoverflow.com/a/24375113/901925
这将对嵌套在任何数据类型的字典中任意深度的数组进行编码/解码。
import base64import jsonimport numpy as npclass NumpyEnprer(json.JSONEnprer): def default(self, obj): """ if input object is a ndarray it will be converted into a dict holding dtype, shape and the data base64 enpred """ if isinstance(obj, np.ndarray): data_b64 = base64.b64enpre(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.JSonEnprer(self, obj)def json_numpy_obj_hook(dct): """ Depres a previously enpred numpy ndarray with proper shape and dtype :param dct: (dict) json enpred ndarray :return: (ndarray) if input was an enpred ndarray """ if isinstance(dct, dict) and '__ndarray__' in dct: data = base64.b64depre(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', NumpyEnprer) 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', NumpyEnprer) 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 'ndepred 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'}}depred nested data {u'level2': {u'level1': array([ 0.+0.j, 1.+0.j, 2.+0.j]), u'foo': u'bar'}}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)