将numpy类型转换为python

2024-04-18 19:44:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个从熊猫身上产生的口述清单,格式如下。我想把它转换成json格式。

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

但是,json.dumps抛出一个错误:TypeError:685不是json可序列化的

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

但是,当我使用np.int32(v)转换数组中每个dict的值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)

Tags: namejsondfnewvar格式错误np
3条回答

看起来你是对的:

>>> 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是可序列化的)。这也是为什么在将dict传递给json.dumps之前不可避免地打印出的dict看起来也只有整数。

这里最简单的解决方法可能是write your own serializer1

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替换最后一行,但是。。。无聊的。类的可扩展性更强:—)

您可以使用我们的ujson叉来处理NumPy int64。caiyunapp/ultrajson: Ultra fast JSON decoder and encoder written in C with Python bindings and NumPy bindings

pip install nujson

那么

>>> import numpy as np
>>> import nujson as ujson
>>> a = {"a": np.int64(100)}
>>> ujson.dumps(a)
'{"a":100}'
>>> a["b"] = np.float64(10.9)
>>> ujson.dumps(a)
'{"a":100,"b":10.9}'
>>> a["c"] = np.str_("12")
>>> ujson.dumps(a)
'{"a":100,"b":10.9,"c":"12"}'
>>> a["d"] = np.array(list(range(10)))
>>> ujson.dumps(a)
'{"a":100,"b":10.9,"c":"12","d":[0,1,2,3,4,5,6,7,8,9]}'
>>> a["e"] = np.repeat(3.9, 4)
>>> ujson.dumps(a)
'{"a":100,"b":10.9,"c":"12","d":[0,1,2,3,4,5,6,7,8,9],"e":[3.9,3.9,3.9,3.9]}'

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

相关问题 更多 >