您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

将numpy类型转换为python

将numpy类型转换为python

看来您是正确的:

>>> import numpy
>>> import json
>>> json.dumps(numpy.int32(685))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 685 is not JSON serializable

这里的可惜的是,numpy的数字__repr__不给你什么任何暗示 键入 他们。int当它们不是( 喘气 )时,它们到处伪装。最终,它似乎json告诉您aint不可序列化,但实际上,它告诉您此特定的np.int32(或您实际拥有的任何类型)不可序列化。(没有真正的惊喜-没有np.int32 序列化)。这也是为什么您 将其传递给json.dumps之前 不可避免地打印出来的字典看起来也只有整数的原因。

这里最简单的解决方法可能是编写自己的序列化器1:

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, numpy.integer):
            return int(obj)
        elif isinstance(obj, numpy.floating):
            return float(obj)
        elif isinstance(obj, numpy.ndarray):
            return obj.tolist()
        else:
            return super(MyEncoder, self).default(obj)

您可以这样使用它:

json.dumps(numpy.float32(1.2), cls=MyEncoder)
json.dumps(numpy.arange(12), cls=MyEncoder)
json.dumps({'a': numpy.int32(42)}, cls=MyEncoder)

等等

1或者,您也可以编写函数并将其作为defaut关键字参数传递给json.dumps在这种情况下,您将用替换最后一行raise TypeError,但是…嗯。该类更可扩展:-)

python 2022/1/1 18:15:36 有405人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶