2017-06-09 21 views
6

Numpyにはさまざまな基本タイプがあり、すべてがlisted hereです。numpyのデータ型がJSONシリアライザブルなのはなぜですか?

私はJSON-、シリアライズされていないsのfloat32に私のプログラムに問題を突き止めてきたので、私は上記のリストからすべてのデータ型のテストを開始しました:だから

>>> 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 

、何complexタイプが直列化可能ではありません、 それは理にかなっている。

しかし、boolの作品とbool_はありません。 intが動作しますが、名前にintが含まれているものはありません。 float,float_およびfloat64はすべて問題なく、float16およびfloat32はありません。

これはなぜですか?明らかに、それらはすべて簡単に文字列に変換できます。スタックトレースは、値を表示するためにrepr()が使用されていることを示しています。 これは意図しないことでしょうか?それとも、この行動に正当な理由がありますか?

+0

'np.float32(...)'オブジェクトを直接作成していますか?または配列から抽出されますか? 'arr.tolist()'同等のものをシリアル化しようとしましたか? – hpaulj

+0

配列の要素を直列化する必要がある場合は、 '.item()'メソッドを使ってPythonスカラに変換することを検討してください。 – hpaulj

+0

https://stackoverflow.com/questions/27050108/convert-numpy-type-to-python 'numpy型をpythonに変換する ' – hpaulj

答えて

4

JSONでシリアライズ可能なデータ型は、すべてのPython組み込み関数です:あなたは、シリアライズJSONではありません示し

>>> np.int is int 
True 
>>> np.float is float 
True 
>>> np.bool is bool 
True 

だから、すべてのnumpyのデータ型。少なくとも一貫しています。

np.float _は(MacOSの上でテスト)np.float64と同じである。

>>> np.float_ is np.float64 
True 

ヘルプは言う:

np.float64

64ビット浮動小数点数。文字コード 'd'。 Python float と互換性があります。

一方:

np.float32

32ビット浮動小数点数。文字コード 'f'。 Cフロート互換。

したがって、Pythonの浮動小数点の互換型はjson.dumps()で動作しますが、Cと互換性はありません。

+0

なぜ、' float64'と 'float_'が機能するのですか? '>>> np.float64はfloat'で、' >>> np.float_はfloat'であり、両方とも 'False'を返します。 – iFreilicht

+0

私の更新された答えを見てください。 –

+1

あなたは '__mro__'を見ることもできます。 'np.float64 .__ mro__'は' float'を含み、np.float32 .__ mro__'は含みません。 – hpaulj

関連する問題