Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SimpleJSON and NumPy array

What is the most efficient way of serializing a numpy array using simplejson?

like image 237
epoch Avatar asked Aug 15 '10 19:08

epoch


1 Answers

In order to keep dtype and dimension try this:

import base64 import json import numpy as np  class NumpyEncoder(json.JSONEncoder):      def default(self, obj):         """If input object is an ndarray it will be converted into a dict          holding dtype, shape and the data, base64 encoded.         """         if isinstance(obj, np.ndarray):             if obj.flags['C_CONTIGUOUS']:                 obj_data = obj.data             else:                 cont_obj = np.ascontiguousarray(obj)                 assert(cont_obj.flags['C_CONTIGUOUS'])                 obj_data = cont_obj.data             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         super(NumpyEncoder, self).default(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  expected = np.arange(100, dtype=np.float) dumped = json.dumps(expected, cls=NumpyEncoder) result = json.loads(dumped, object_hook=json_numpy_obj_hook)   # None of the following assertions will be broken. assert result.dtype == expected.dtype, "Wrong Type" assert result.shape == expected.shape, "Wrong Shape" assert np.allclose(expected, result), "Wrong Values" 
like image 106
tlausch Avatar answered Oct 08 '22 02:10

tlausch