NumPyのデータ型dtypeを徹底解説:種類とastypeでの変換(キャスト)


 


NumPyのndarrayは、Pythonのリストとは異なり、配列内の全ての要素が同じデータ型を持つ必要があります。このデータ型を定義するのが**dtype**(データタイプ)です。dtypeを適切に管理することは、メモリ効率の向上や計算速度の最適化、さらには意図しないデータ損失を防ぐ上で非常に重要です。

この記事では、NumPyで利用できるdtypeの主要な種類を一覧で紹介し、配列のデータ型を変換する(キャストする)ためのastype()メソッドの使い方について詳しく解説します。


 

NumPyのデータ型dtypeとは?

 

dtypeは、NumPy配列に格納される各要素がどのような種類のデータであるか(整数、浮動小数点数、ブール値など)、そしてそのデータがメモリ上でどれくらいのサイズを占めるか(例: 32ビット整数、64ビット浮動小数点数)を定義します。

配列を作成する際にdtypeを指定しない場合、NumPyはPythonのデータから自動的に最適なdtypeを推測します。

Python
 
import numpy as np

# デフォルトでdtypeが推論される
arr_int = np.array([1, 2, 3])
arr_float = np.array([1.0, 2.5, 3.0])

print(f"arr_intのdtype: {arr_int.dtype}")   # int64 (環境によって異なる場合あり)
print(f"arr_floatのdtype: {arr_float.dtype}") # float64

 

なぜdtypeが重要なのか?

 

  • メモリ効率: 例えば、小さな整数しか含まない配列にfloat64(8バイト)を使うのは非効率です。int8(1バイト)を使えばメモリを大幅に節約できます。

  • 計算速度: 特定のデータ型は、CPUによる処理が高速になる場合があります。

  • データの正確性: 浮動小数点数と整数の変換、あるいはより小さいビット数の型への変換では、データの精度が失われる可能性があります。


 

NumPyの主要なdtype一覧

 

NumPyには、さまざまな種類のデータ型が用意されています。代表的なものをいくつかご紹介します。

 

整数型 (Integer Types)

 

dtypeの表現 説明 サイズ (ビット)
bool_ ブール値 (True/False) 8
int8 符号付き整数 8
int16 符号付き整数 16
int32 符号付き整数 32
int64 符号付き整数 64
uint8 符号なし整数 8
uint16 符号なし整数 16
uint32 符号なし整数 32
uint64 符号なし整数 64

intは符号付き(負の値も扱える)、uintは符号なし(0以上の値のみ扱える)を意味します。ビット数が大きいほど、より大きな(または小さな)数値を表現できます。

 

浮動小数点数型 (Floating-Point Types)

 

dtypeの表現 説明 サイズ (ビット)
float16 半精度浮動小数点数 16
float32 単精度浮動小数点数 32
float64 倍精度浮動小数点数 64
float128 四倍精度浮動小数点数 (非推奨) 128

通常、float64がPythonのfloatに対応し、標準的に使われます。機械学習ではfloat32がメモリ効率や計算速度の観点からよく使われます。

 

複素数型 (Complex Types)

 

dtypeの表現 説明 サイズ (ビット)
complex64 単精度複素数 64
complex128 倍精度複素数 128

実部と虚部がそれぞれ指定されたビット数の浮動小数点数で表現されます。

 

その他

 

  • object: Pythonオブジェクトをそのまま格納します。NumPyの高速演算の恩恵を受けにくいですが、様々な型の要素を混在させたい場合に利用できます。

  • str_ (またはU): Unicode文字列。

  • datetime64: 日付と時刻。

  • timedelta64: 時間間隔。


 

astype()によるデータ型変換(キャスト)

 

既存のNumPy配列のデータ型を別の型に変換するには、astype()メソッドを使用します。このメソッドは、新しいdtypeを持つ配列のコピーを返します。元の配列は変更されません。

 

基本的な使い方

 

Python
 
import numpy as np

arr_float64 = np.array([1.5, 2.7, 3.1], dtype=np.float64)
print(f"元の配列: {arr_float64}, dtype: {arr_float64.dtype}")

# float64からint32へ変換(小数点以下は切り捨てられる)
arr_int32 = arr_float64.astype(np.int32)
print(f"int32へ変換: {arr_int32}, dtype: {arr_int32.dtype}") # [1 2 3]

# int32からfloat32へ変換
arr_float32 = arr_int32.astype(np.float32)
print(f"float32へ変換: {arr_float32}, dtype: {arr_float32.dtype}") # [1. 2. 3.]

# ブール値への変換(0はFalse、それ以外はTrue)
arr_bool = np.array([-1, 0, 100]).astype(np.bool_)
print(f"bool_へ変換: {arr_bool}, dtype: {arr_bool.dtype}") # [ True False  True]

 

データ損失に注意!

 

astype()による変換では、データ型によっては情報が失われる可能性があります。

  • 浮動小数点数から整数へ: 小数点以下の情報が切り捨てられます。

  • より大きな型からより小さな型へ: 表現できる値の範囲を超える場合、オーバーフローやデータ切り捨てが発生します。

    Python
     
    # int64からint8への変換例
    large_num = np.array([300], dtype=np.int64)
    try:
        # int8の範囲は通常 -128 から 127
        converted_num = large_num.astype(np.int8)
        print(f"変換結果: {converted_num}") # 期待通りにならない可能性がある
    except OverflowError as e:
        print(f"エラー: {e}") # オーバーフローエラーが発生することもあるが、NumPyではラップアラウンドすることが多い
    # 多くの環境で [44] と出力されます。これはオーバーフローによる「ラップアラウンド」です。
    

特にデータの前処理を行う際は、変換後のデータの範囲と精度に十分注意を払う必要があります。


 

まとめ

 

NumPyのdtypeは、配列の要素のデータ型を定義し、効率的なメモリ管理と高速な計算を可能にします。さまざまな種類のdtypeが存在し、用途に応じて最適な型を選択することが重要です。

astype()メソッドを使うことで、配列のデータ型を柔軟に変換できますが、データ損失のリスクも理解しておく必要があります。これらの知識を活かして、NumPyをより効果的に活用しましょう!

 

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座