前回の記事で、NumPyの強力な多次元配列操作機能「ndarray」の基礎について軽く紹介した。

本記事ではndarrayのデータ型と、ベクトル演算について詳しく取り上げていこう。

dtypeはndarrayのデータ型

ndarrayにはdtypeという属性が用意されていることは前回の記事でも説明したとおりだ。

以下のようにdtypeを使用することで、ndarrayの要素のデータ型を得られる。

import numpy as np

arr = np.array([1, 2, 3])
arr.dtype # dtype('int64')

実はこのdtype自体もndarrayのデータ型で、つまりはデータのデータと言えるわけだ。

dtypeはメタデータなので、要素をメモリ上にそのまま保持することができるため、ndarrayをディスクへ直接読み書きしたり、C言語などの多言語プログラムとの連携もしやすくなっているのだ。

dtypeの命名規則

dtypeには様々なデータ型が用意されているが、数値型を指定する際は、intやfloatなどの型名の後にビット数を指定する必要がある。

下記によく現れるデータ型をまとめておく。

データ型説明
int8符号あり8ビット整数型
int16符号あり16ビット整数型
int32符号あり32ビット整数型
int64符号あり64ビット整数型
float16半精度不動小数点型
float32単精度不動小数点型
float64倍精度不動小数点型
bool真偽値型
objectPythonオブジェクト型
string_固定長文字列型(1文字あたり1バイト)
unicode_固定長ユニコード文字列型
(1文字あたりのバイト数は環境による)

dtypeの型変換

dtypeを型変換(キャスト)する場合、astypeメソッドを使う。
元となるndarrayをキャストしたものを、新しいndarrayとしてコピー生成する。

import numpy as np

arr = np.array([1, 2, 3])
arr.dtype # dtype('int64')

arr2 = arr.astype(np.float64)
arr2.dtype # dtype('float64')

また、小数を整数にキャストする場合、小数点以下の値は以下のように切り捨てられる。

import numpy as np

arr = np.array([1.1, 2.8, 3.4])
arr2 = arr.astype(np.int32)

arr2 #  array([1, 2, 3], dtype=int32)

NumPyで小数点以下を丸める場合は、四捨五入ではなく0に丸められるのだ。

別の手段で型変換をする

キャストする場合の別の手段として、他のndarrayのdtype属性を適用することもできる。

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.array([1.1, 2.8, 3.4])

arr3 = arr1.astype(arr2.dtype)
arr3 # array([1., 2., 3.])

ndarrayのベクトル演算

配列同士の演算をおこなう際、ndarrayではループ処理をおこなう必要はない。
これはNumPyの重要な機能の一つで、ベクトル演算と呼ばれる。

まず、ベクトル演算の基礎概念として、同サイズのndarrayは同位置の要素で計算がおこなわれる。

例を見てみよう。

import numpy as np

arr = np.array([
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10]
])

arr * arr
# array([[  1,   4,   9,  16,  25],
#       [ 36,  49,  64,  81, 100]])

arr + arr
# array([[ 2,  4,  6,  8, 10],
#       [12, 14, 16, 18, 20]])

スカラー値とndarrayの計算も見てみよう。
要素毎に計算がおこなわれているのが分かる。

import numpy as np

arr = np.array([
    [1, 2, 3, 4, 5],
    [6, 7, 8, 9, 10]
])

2 + arr
# array([[ 3,  4,  5,  6,  7],
#       [ 8,  9, 10, 11, 12]])

また、ndarrayを比較し真偽値を得ることもできる。

import numpy as np

arr1 = np.array([1, 7, 3, 9, 5])
arr2 = np.array([6, 2, 8, 4, 10])

arr1 > arr2
# array([False,  True, False,  True, False])

まとめ

以上、ndarrayのデータ型とベクトル演算の基礎について紹介してきた。

NumPyを使えば、手軽に強力な配列操作機能を使うことができるようになる。

次回は複雑なndarrayの多次元操作をおこなう、インデックス参照やスライシングについて学んでいく。