おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

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