NumPy 高速配列処理

Advertisement

 
NumPy ユニバーサル関数

 
 機械学習や人工知能、データサイエンスなどの分野で Python が活用される理由の一つとして、NumPy (Numerical Python) の存在があります。NumPy は N 次元配列オブジェクト (ndarray : n-dimensional array) をベースに、大規模な演算を高速処理する科学技術用パッケージです。NumPy の ndarray は Python 本体に組み込まれているリストに似ていますが、扱う要素を数値に限定することで演算の高速化を実現させています。

 NumPy およびその拡張パッケージである SciPy には、この ndarray を操作するための高品質な数学関数が揃えられています。NumPy のユーザーは数値計算の専門家となる必要はありません。実際のところ、ごく簡単な数値積分でさえ、あらゆる状況に対応できる汎用性を備えたプログラムの構築には神経をすり減らします。NumPy を活用すれば、自身で複雑な計算プログラムを組むことなく、状況に応じて必要な関数をインポートしながらコードを記述するだけで、高水準のモジュールやパッケージを作成することができます。
 

N 次元配列オブジェクト (ndarray)

配列の定義

 numpy.array() に数値のリストを渡すと N 次元配列オブジェクトが生成されます。1 次元配列を作成して、type()関数でクラスを調べてみましょう。

# NumPyをインポート
import numpy as np

# リスト[1,2,3]を渡して1次元配列を作成
x = np.array([1, 2, 3])

print(x)
print(type(x))
[1 2 3]
<class 'numpy.ndarray'>

 [1 2 3] という 1 次元配列が表示されました。クラス名は numpy.ndarray です。リストとは異なり、各要素を区切る "," がありません。次は 2 つのリストを渡して配列を定義してみます。

# NumPyをインポート
import numpy as np

row1 = [1, 2, 3]
row2 = [4, 5, 6]

# row1とrow2を渡して2次元配列を作成
x = np.array([row1, row2])

print(x)
[[1 2 3]
 [4 5 6]]

 numpy.array() にはリストを要素にもつリストという入れ子構造のデータを渡しています。このように [] で 2 重に括ったデータを渡すと 2 次元配列が生成されます。同様に [] で 3 重に括ったリストを渡すと 3 次元配列が定義されます。
 

要素の参照

 1 次元配列の要素にアクセスするときは

 ndarray[index]

とします。リストなどと同じく、要素の index は 0, 1, 2, ... と割り当てられています。

# NumPyをインポート
import numpy as np

x = np.array([1, 2, 3])

# 2番目(インデックス1)の要素へのアクセス
print(x[1])
2

 2 次元配列の要素にアクセスするときは

 ndarray[index, index, ...]

のように記述します。

# NumPyをインポート
import numpy as np

row1 = [1, 2, 3]
row2 = [4, 5, 6]
row3 = [7, 8, 9]

# 2次元配列を作成
x = np.array([row1, row2, row3])

# 2行目の3列目の要素にアクセス
print(x[1, 2])
6

 スライスによって複数の要素を取り出すこともできます。

# NumPyをインポート
import numpy as np

row1 = [1, 2, 3]
row2 = [4, 5, 6]
row3 = [7, 8, 9]

# 2次元配列を作成
x = np.array([row1, row2, row3])

# 2行目以降の2列目と3列目をスライス
print(x[1:, 1:3])
[[5 6]
 [8 9]]

 

要素の変更

 代入演算子を使ってアクセスした要素を書き換えることもできます。

# NumPyをインポート
import numpy as np

row1 = [1, 2, 3]
row2 = [4, 5, 6]
row3 = [7, 8, 9]

# 2次元配列を作成
x = np.array([row1, row2, row3])

# 2行目2列目の要素を0に変更
x[1, 1] = 0

print(x)
[[1 2 3]
 [4 0 6]
 [7 8 9]]