将numpy类型转换为python

将numpy类型转换为python,python,json,numpy,pandas,Python,Json,Numpy,Pandas,我有一个清单,下面是我从熊猫身上得到的。我想把它转换成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[l

我有一个清单,下面是我从熊猫身上得到的。我想把它转换成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)

看起来你是对的:

>>> 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
您可以这样使用它:

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
。在这个场景中,您将最后一行替换为
raisetypeerror
,但是。。。无聊的。该类更具可扩展性:-)

如果将数据保留在任何
pandas
对象中,库将为Series、DataFrame和所有其他更高维度的类提供一个
函数


请参见

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

您可以使用我们的ujson分支处理NumPy int64

pip安装nujson
然后

>>将numpy作为np导入
>>>将nujson导入为ujson
>>>a={“a”:np.int64(100)}
>>>ujson.dumps(a)
“{a:100}”
>>>a[“b”]=np.64(10.9)
>>>ujson.dumps(a)
“{”a:100,“b:10.9}”
>>>a[“c”]=名词短语(“12”)
>>>ujson.dumps(a)
“{a:100,b:10.9,c:“12”}”
>>>a[“d”]=np.数组(列表(范围(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.重复(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]”

你的代码对我来说很好。。。(Python 3.4.2)
[{“1.0”:685},{“2.0”:8}]
那么
list\u val
是一个numpy数组吗?是的,它是从数据帧生成的。我会在帖子中更新完整的代码所以…你为什么把
np.int32(v)
而不是
v
(或者
int(v)
;不确定
v
是什么)放在
frequer\u var
中?还有,当你将来遇到这样的问题时,尝试先查看每个对象的
repr
,然后查看
类型
,而不仅仅是打印它们的
str
。(并在你的问题中包括结果。)只知道你有一个
np.float32
或任何东西要比猜测可能存在某种类型的类型转换问题容易得多。为了真正的乐趣,请尝试使用
np.float64
np.bool
,一切都很好,因为它们实际上是
float
bool
的子类。仔细想想,这两种类型都是子类,而其他数字类型都不是子类,这是有道理的,但在你这么做之前,它可以进行一些真正有趣的调试…@abarnert--
np.float64
是显而易见的(毕竟,它只是C的
double
,这是python使用的
float
),但是
np.bool
没有那么多。它可能是
np.int32
的一个子类,我想。。。查看
np.int64
\uuu mro\uuuuu
,我希望它也能工作(至少在python2.x:-)或者您可以将numpy类型转换为本机类型。有关如何执行此操作的详细信息,请参阅。或者,您可以使用默认情况下执行此操作的
json\u技巧
库(免责声明:我是主要贡献者)。这不会像系列一样起作用。to\u json()仍然无法处理numpy.ndarrays在经历了大量的头痛和阻力之后,为一个看似简单的问题创建自定义函数或类,这对我有用!!我喜欢它,因为它让事情变得简单!
json.dumps(numpy.float32(1.2), cls=MyEncoder)
json.dumps(numpy.arange(12), cls=MyEncoder)
json.dumps({'a': numpy.int32(42)}, cls=MyEncoder)