Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么json.dumps(list(np.arange(5))失败,而json.dumps(np.arange(5.tolist())工作_Python_Numpy_Python 2.7 - Fatal编程技术网

Python 为什么json.dumps(list(np.arange(5))失败,而json.dumps(np.arange(5.tolist())工作

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

当运行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()方法有区别吗?

因为numpy数组的元素不是本机int,而是numpy自己的类型:

>>> type(np.arange(5)[0])
<type 'numpy.int64'>

它看起来像是
tolist()
方法将numpy
int32
(或任何大小)变回
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'>