numpyの型
自分用のメモにまとめておく。
numpyの基本的な型は以下の5つ。
ただし、(bool型を除いた)データ型はそれぞれ異なるサイズがああります。
たとえば、int型なら、
- numpy.int8
- numpy.int16
- numpy.int32
- numpy.int64
4種類があります(intの後の数字はbit数を表しています)。単にnumpy.intとすると、環境に依って、numpy.int32もしくはnumpy.int64を表します(最近のPCだと、ほとんどnumpy.int64になっていると思います)。
同様に、uint,float,complexにも、異なるサイズのものがあり、単にnumpy.floatやnumpy.comolexとすると、それぞれ、numpy.float64やnumpy.complex128を表します。
Pythonのビルトインにもint, float, complexがありますが、numpy.int(=numpy.int32 or numpy.int64), numpy.float(=numpy.float64), numpy.complex(=numpy.complex128)はこれらと同じもののようです。
一方、numpy.int16やnumpy.float128などは、対応するpythonの型はありません。
numpyの中では、int, float, complexと書いても、numpy.int, numpy.float, numpy.complexと書いても問題ありませんが、たぶん、前者のように書いた方が良いと思われます。もちろん、ビルトインと違うサイズを使いたいときは、numpy.float128のように書く必要があります(pure pythonのfloat128は存在しません)。
import numpy as np print np.array([1], dtype=int).dtype #int64 or int32 print np.iinfo(np.int64) print np.array([1], dtype=float).dtype #float64 print np.finfo(np.float64) print np.array([1], dtype=complex).dtype #complex128
dtype=floatの部分は上記の説明のように、dtype=np.floatと書いても、dtype=np.float64と書いても同じです。
import numpy as np c_py = 1. c_np = np.array([1.], dtype=float) c = np.float(1.) print type(c_py) #<type 'float'> print type(c) #<type 'float'> print type(c_np[0]) #<type 'numpy.float64'> print c_np.dtype #float64 print c_np.dtype == type(c_py) #True print c_np.dtype is type(c_py) #False print type(c_np[0]) == type(c_py) #False print c_np.dtype == np.float64 #True print c_np.dtype == np.float #True print c_np.dtype == float #True print np.float == np.float64 #False print type(c_np[0]) == np.float #Falose
書き方によって、型の種類がnp.float64となったり、floatとなったりするが、基本的には同じものなので、あまり気にしなくて良いと思われる。
詳しくはhttps://github.com/numpy/numpy/issues/3998のrkern氏のコメントを参照。
また、型を比較したい時は、array.dtype == floatのように書くのが良さそう。
(np.floatやtype()やisは使わない)
Ref:
1.3.3. より込み入った配列 — Scipy lecture notes
Data types — NumPy v1.9 Manual
色々と考えてみる: 文系のための「数値型」(2)
Difference between Python float and numpy float32 - Stack Overflow