将 numpy 类型转换为 python

新手上路,请多包涵

我有一个从熊猫生成的以下形式的字典列表。我想将其转换为 json 格式。

 list_val = [{1.0: 685}, {2.0: 8}]
output = json.dumps(list_val)

然而,json.dumps 抛出错误:TypeError: 685 is not JSON serializable

我猜这是从 numpy 到 python(?) 的类型转换问题。

但是,当我使用 np.int32(v) 转换数组中每个字典的值 v 时,它仍然会抛出错误。

编辑:这是完整的代码

            new = df[df[label] == label_new]
            ks_dict = json.loads(content)
            ks_list = ks_dict['variables']
            freq_counts = []

            for ks_var in ks_list:

                    freq_var = dict()
                    freq_var["name"] = ks_var["name"]
                    ks_series = new[ks_var["name"]]
                    temp_df = ks_series.value_counts().to_dict()
                    freq_var["new"] = [{u: np.int32(v)} for (u, v) in temp_df.iteritems()]
                    freq_counts.append(freq_var)

           out = json.dumps(freq_counts)

原文由 ubh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

看起来你是对的:

 >>> 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 告诉你 int 不可序列化,但实际上,它告诉你这个特定的 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 ,但是……嗯。该类更具可扩展性:-)

原文由 mgilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以将数组转换为 python 列表(使用 tolist 方法),然后将列表转换为 json。

原文由 Emanuele Paolini 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题