所以我尝试编写一个处理不同 numpy
值的自定义编码器:
class NumpyEncoder(DjangoJSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
if np.isnan(obj) or np.isinf(obj):
return None
else:
return super().default(obj)
但是,它似乎没有处理 np.NaN
或 np.inf
对象:
obj = {'test': np.NaN, 'test2': np.inf}
json.dumps(obj, cls=LazyNumpyEncoder)
Out[5]: '{"test": NaN, "test2": Infinity}'
我也尝试过使用elif isinstance(obj, np.nan):
,但这也不起作用。
我想要的是将我的 NaN
和 Infinite (包括负无限值)转换为空值。
有人知道我错在哪里吗?
最佳答案
@Vovanrock 解释得非常好,但我会发布我为解决问题所做的工作。在通过 dumps
运行字典之前,我只是将 inf
和 nan
对象转换为字符串:
def _convert_numpy_objects(self, dict_to_convert : Dict) -> Dict:
new = {}
for k, v in dict_to_convert.items():
if isinstance(v, dict):
new[k] = self._convert_numpy_objects(v)
else:
if isinstance(v, float) and (np.isnan(v) or np.isinf(v)):
new[k] = str(v)
else:
new[k] = v
return new
关于Python 自定义 JSON 编码器不处理 numpy NaN 或无限值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610959/