我需要将dtype float128的numpy数组转储到JSON。为此,我编写了一个自定义数组编码器,该数组编码器通过在数组上调用tolist()
来正确处理数组。对于float以外的所有实值dtypes,此方法都很好。请参见以下示例:
import json
import numpy as np
class ArrayEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, np.ndarray):
out = {'__ndarray__': True,
'__dtype__': o.dtype.str,
'data': o.tolist()}
return out
return json.JSONEncoder.default(self, o)
arr64 = np.array([1, 2, 3], dtype='float64')
arr128 = np.array([1, 3, 4], dtype='float128')
json.dumps(arr64, cls=ArrayEncoder) # fine
json.dumps(arr128, cls=ArrayEncoder) # TypeError
TypeError:float128类型的对象不可JSON序列化
编码器的目的是提供JSON可以处理的格式的数据。在这种情况下,数据将转换为纯Python浮点数列表,这不会造成任何麻烦。一种可能的解决方案是将编码器中的转换线更改为
class ArrayEncoder(json.JSONEncoder):
def default(self, o):
...
'data': o.astype('float64').tolist()
...
但是,我很感兴趣。为什么JSON即使使用使用可序列化格式提供数据的编码器,仍会引发错误?