NumPyの数値型が、対応するPythonの数値型を継承しているかどうか調べてみました。
import builtins
import numpy as np
np_numt = [
np.bool_,
np.int_,
np.intc,
np.intp,
np.int8,
np.int16,
np.int32,
np.int64,
np.uint8,
np.uint16,
np.uint32,
np.uint64,
np.float_,
np.float16,
np.float32,
np.float64,
np.complex_,
np.complex64,
np.complex128
]
py_numt = ["bool", "int", "float", "complex"]
for np_t in np_numt:
py_t = next(tstr for tstr in py_numt if tstr in str(np_t))
print(np_t, py_t, issubclass(np_t, getattr(builtins, py_t)))
このコードを実行すると、
<class 'numpy.bool_'> bool False
<class 'numpy.int32'> int False
<class 'numpy.int32'> int False
<class 'numpy.int64'> int False
<class 'numpy.int8'> int False
<class 'numpy.int16'> int False
<class 'numpy.int32'> int False
<class 'numpy.int64'> int False
<class 'numpy.uint8'> int False
<class 'numpy.uint16'> int False
<class 'numpy.uint32'> int False
<class 'numpy.uint64'> int False
<class 'numpy.float64'> float True
<class 'numpy.float16'> float False
<class 'numpy.float32'> float False
<class 'numpy.float64'> float True
<class 'numpy.complex128'> complex True
<class 'numpy.complex64'> complex False
<class 'numpy.complex128'> complex True
となり、numpy.float64
(とそのエイリアスのnumpy.float_
)、およびnumpy.complex128
(とそのエイリアスのnumpy.complex_
)のみが、それぞれ対応するPythonの型float
とcomplex
のサブタイプのようです。
numpy.float64
は、標準ライブラリjson
ではjsonableですが、戻した値は、Pythonの型になっているので注意が必要です。例えば、次の式はPythonのfloat
型になります。
import json
type(json.loads(json.dumps(np.float64(64))))
それ以外のNumPyの数値型は、デフォルトのjson
では、エラーとなります。