NumPyの多次元配列ndarrayには、データ型を表現するdtype
というプロパティがあります。このdtype
を指定することで、要素のデータ型を指定して確保するメモリ量を調節することができます。
本記事では、dtype
に焦点を当てながらNumPyで指定できるdtypeの種類と指定方法、そして内部でdtypeが活用される仕組みについて解説していきます。
dtypeが必要な理由
NumPyは基本的には、大量のデータ操作を高速に実行できるように内部ではCで実装されています。Python自体はそれほど高速な言語ではないため、行列演算の操作やデータの扱いはCから行われます。
つまり、正しくNumPy配列のデータ型を指定することでPythonからでもメモリ効率と実行効率の良いコードを実装することができます。
データ型
まずは、NumPyで使うことのできるデータ型についてまとめます。NumPyのデータ型を型で分類すると整数のint
、浮動小数のfloat
、複素数のcomplex
、符号なしの整数のuint
、真偽値のbool
になります。さらに、型ごとに1要素あたりに確保するデータサイズをビットで指定することができます。
データ型ごとに分類すると以下の通りになります。
int (符号付きの整数)
データ型 |
概要 |
int8 |
8ビットの符号付き整数 |
int16 |
16ビットの符号付き整数 |
int32 |
32ビットの符号付き整数 |
int64 |
64ビットの符号付き整数 |
uint (符号なしの整数)
データ型 |
概要 |
uint8 |
8ビットの符号なし整数 |
uint16 |
16ビットの符号なし整数 |
uint32 |
2ビットの符号なし整数 |
uint64 |
64ビットの符号なし整数 |
float (浮動小数点数) [1]
データ型 |
概要 |
float16 |
16ビットの浮動小数点数 |
float32 |
32ビットの浮動小数点数 |
float64 |
64ビットの浮動小数点数 |
float128 |
128ビットの浮動小数点数 |
bool –真偽値–
データ型 |
概要 |
bool |
TrueかFalseで表される、真偽値。データ量としては8ビット |
まずは、それぞれのデータ型でどのような表記がされるのかを確かめてみましょう。NumPyのndarrayのdtypeは、arr.dtype
のようにして知ることができます。
中身の要素をint
やfloat
の値を指定しても、データ型がbool
だった場合は、勝手にbool値へとキャストされた要素が入ります。
原則として、配列が生成された後でデータ型の変換はおすすめしません。
データ型で指定できるビット数は変換される前のデータ型のビット列を何ビットごとに区切って読み取るか、という風に読み替えることもでき、ビット数を変換してしまうとそもそも返ってくる数字列が異なることがあります。
同様に、データ型を変換させてもデータの読み取り方を変えているだけなので、データ型を元に戻すと元の配列を再現することができます。サンプルコードを見ながらそれを確かめていきましょう。
これらのビット数の違いを確かめます。8ビット(bit) = 1バイト(byte)です。
参考
[1] ビットで表す数字の世界~浮動小数点編~ FPGA 2.0