Python 自定义 JSON 编码器不处理 numpy NaN 或无限值

标签 python json numpy python-3.6

所以我尝试编写一个处理不同 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.NaNnp.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 运行字典之前,我只是将 infnan 对象转换为字符串:

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/

相关文章:

ios - 如何在 iOS 中按特定顺序异步下载文件?

python - 使numpy 2d数组中每行中除最大n元素之外的所有元素为零

python - 如何确定 PloneFormGen 中可用的属性和方法

python - 在 Python 中解析嵌套 Json 以删除列中的特殊字符

python - 如何使用 Windows 批处理文件获取 Python 位置?

android - 将json格式的字符串转换成jsonObject Android

php - HTML 字段;在 json_encode 之后设置 PHP 数组 - 发送到 Jquery?

python - numpy 按索引求和矩阵行

Python 和从列表创建 2d numpy 数组

python - Hashlib 的 md5 对于相同的输入产生不同的输出