Python 为什么json.dumps(list(np.arange(5))失败,而json.dumps(np.arange(5.tolist())工作
当运行Ubuntu的计算机最近被更新,Python的默认版本改为2.7时,我注意到了这个问题Python 为什么json.dumps(list(np.arange(5))失败,而json.dumps(np.arange(5.tolist())工作,python,numpy,python-2.7,Python,Numpy,Python 2.7,当运行Ubuntu的计算机最近被更新,Python的默认版本改为2.7时,我注意到了这个问题 import json import numpy as np json.dumps(list(np.arange(5))) # Fails, throws a "TypeError: 0 is not JSON serializable" json.dumps(np.arange(5).tolist()) # Works numpy数组的list()方法和tolist()方法有区别吗?因为nump
import json
import numpy as np
json.dumps(list(np.arange(5))) # Fails, throws a "TypeError: 0 is not JSON serializable"
json.dumps(np.arange(5).tolist()) # Works
numpy数组的list()方法和tolist()方法有区别吗?因为numpy数组的元素不是本机int,而是numpy自己的类型:
>>> type(np.arange(5)[0])
<type 'numpy.int64'>
它看起来像是
tolist()
方法将numpyint32
(或任何大小)变回int
,JSON知道如何处理它:
>>> list(np.arange(5))
[0, 1, 2, 3, 4]
>>> type(list(np.arange(5)))
<type 'list'>
>>> type(list(np.arange(5))[0])
<type 'numpy.int32'>
>>> np.arange(5).tolist()
[0, 1, 2, 3, 4]
>>> type(np.arange(5).tolist())
<type 'list'>
>>> type(np.arange(5).tolist()[0])
<type 'int'>
列表(np.arange(5))
[0, 1, 2, 3, 4]
>>>类型(列表(np.arange(5)))
>>>类型(列表(np.arange(5))[0])
>>>np.arange(5).tolist()
[0, 1, 2, 3, 4]
>>>类型(np.arange(5.tolist())
>>>类型(np.arange(5.tolist()[0])
正如文档中所说的tolist()
:
将数组作为(可能是嵌套的)列表返回
以(嵌套的)Python列表的形式返回数组数据的副本数据项
已转换为最接近的兼容Python类型。
最后一行在这里起作用。问题是第一行没有得到int,而是得到numpy.int64。无法序列化。您知道这是否是最近的更改吗?代码在系统升级之前就可以工作了。我恐怕不确定——甚至不确定更改是在numpy中(比如类型重命名)还是在Python JSON端(可能是用来更努力地处理未知类型?),方法是显式地为不可序列化的对象传递一个。我看到了一个类似的问题,我无法
JSON.dumps()
np.int64变量。但是,它在Python2.7.9中适用,但在3.4中不适用。
>>> list(np.arange(5))
[0, 1, 2, 3, 4]
>>> type(list(np.arange(5)))
<type 'list'>
>>> type(list(np.arange(5))[0])
<type 'numpy.int32'>
>>> np.arange(5).tolist()
[0, 1, 2, 3, 4]
>>> type(np.arange(5).tolist())
<type 'list'>
>>> type(np.arange(5).tolist()[0])
<type 'int'>