Python 为什么有些numpy数据类型是JSON可序列化的,而有些则不是?

Python 为什么有些numpy数据类型是JSON可序列化的,而有些则不是?,python,json,numpy,serialization,types,Python,Json,Numpy,Serialization,Types,Numpy有很多不同的基本类型,所有这些都是 我在程序中发现了一个问题,float32s不可JSON序列化,因此我开始测试上面列表中的所有数据类型: >>> import numpy as np >>> from json import dumps >>> dumps(np.bool(True)) 'true' >>> dumps(np.bool_(True)) Traceback (most recent call las

Numpy有很多不同的基本类型,所有这些都是

我在程序中发现了一个问题,
float32
s不可JSON序列化,因此我开始测试上面列表中的所有数据类型:

>>> import numpy as np
>>> from json import dumps
>>> dumps(np.bool(True))
'true'
>>> dumps(np.bool_(True))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.4/json/encoder.py", line 173, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: True is not JSON serializable
>>> dumps(np.int(0))
'0'
>>> dumps(np.int_(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.intc(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.intp(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.int8(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.int16(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.int32(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.int64(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.uint8(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.uint16(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.uint32(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.uint64(0))
Traceback (most recent call last):
  [...]
TypeError: 0 is not JSON serializable
>>> dumps(np.float(0))
'0.0'
>>> dumps(np.float_(0))
'0.0'
>>> dumps(np.float16(0))
Traceback (most recent call last):
  [...]
TypeError: 0.0 is not JSON serializable
>>> dumps(np.float32(0))
Traceback (most recent call last):
  [...]
TypeError: 0.0 is not JSON serializable
>>> dumps(np.float64(0))
'0.0'
>>> dumps(np.complex(0))
Traceback (most recent call last):
  [...]
TypeError: 0j is not JSON serializable
>>> dumps(np.complex_(0))
Traceback (most recent call last):
  [...]
TypeError: 0j is not JSON serializable
>>> dumps(np.complex64(0))
Traceback (most recent call last):
  [...]
TypeError: 0j is not JSON serializable
>>> dumps(np.complex128(0))
Traceback (most recent call last):
  [...]
TypeError: 0j is not JSON serializable
>>将numpy作为np导入
>>>从json导入转储
>>>转储(np.bool(真))
“真的”
>>>转储(np.bool_u2;(真))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.4/json/_init__.py”,第230行,转储
返回默认编码器编码(obj)
文件“/usr/lib/python3.4/json/encoder.py”,第192行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
iterencode中的文件“/usr/lib/python3.4/json/encoder.py”,第250行
返回_iterencode(o,0)
默认情况下,文件“/usr/lib/python3.4/json/encoder.py”第173行
raise TypeError(repr(o)+“不可JSON序列化”)
TypeError:True不可JSON序列化
>>>转储(np.int(0))
'0'
>>>转储(np.int_u0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.intc(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.intp(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.int8(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.int16(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.int32(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.int64(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.uint8(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.uint16(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.uint32(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.uint64(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0不可JSON序列化
>>>转储(np.浮点(0))
'0.0'
>>>转储(np.float_u0))
'0.0'
>>>转储(np.16(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0.0不可JSON序列化
>>>转储(np.32(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0.0不可JSON序列化
>>>转储(np.64(0))
'0.0'
>>>转储(np.complex(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0j不可JSON序列化
>>>转储(np.complex_u0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0j不可JSON序列化
>>>转储(np.complex64(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0j不可JSON序列化
>>>转储(np.complex128(0))
回溯(最近一次呼叫最后一次):
[...]
TypeError:0j不可JSON序列化
因此,没有一个复杂的类型是可序列化的,这是有意义的

但是
bool
起作用,而
bool\u
不起作用
int
可以工作,但名称中包含
int
的任何内容都不能工作<代码>浮点、
浮点
float64
都可以,但是
float16
float32
不行


为什么会这样?显然,它们都可以很容易地转换为字符串,stacktrace甚至显示用于显示其值的
repr()
。这可能是无意的吗?或者说这种行为有很好的理由吗?

JSON可序列化的数据类型都是Python内置的:

>>> np.int is int
True
>>> np.float is float
True
>>> np.bool is bool
True
因此,您显示的所有NumPy数据类型都不是JSON可序列化的。至少是一致的

np.float
\与
np.float64
相同(在MacOS上测试):

帮助说:

np.float64

64位浮点数。字符代码“d”。Python浮点 兼容

鉴于:

np.float32

32位浮点数。字符代码“f”。C浮点兼容


因此,Python float兼容类型可以使用
json.dumps()
,但与C兼容的类型不能使用。

那么为什么
float64
float\uu
可以使用呢
>>np.float64是float
>>np.float\uuuu是float
都返回
False
。您还可以查看
\uuu mro\uuuu
np.float64.\uuuMRO\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?还是从数组中提取?已经尝试序列化<代码> ART.TistIt()/Case>等效项吗?如果需要序列化数组的元素,请考虑使用<代码> .ITEM()/Case>方法将其转换为Python标量。参见“代码>转换NoMPY类型到Python < /C>”
>>> np.float_ is np.float64
True