Vicky34 blog.

IT・プログラミングメイン

NumPyについて

NumPy

ゼロから作るディープラーニング始めました。

ディープラーニングの実装では、配列や行列の計算が多く登場する。
NumPyの配列クラス(numpy.array)には便利なメソッドが多く用意されていて、ディープラーニングの実装においてもそれらのメソッドを利用します。

NumPyのインポート

import numpy as np

NumPy配列の生成

NumPyの配列を生成するために、np.array()というメソッドを用いる。
np.array()は、Pythonのリストを引数にとり、NumPy用の配列(numpy.ndarray)を作成します。

import numpy as np

# 配列の生成
x = np.array([1.0, 2.0, 3.0])
print(x)       #=> [ 1.  2.  3.]
print(type(x)) #=> <class 'numpy.ndarray'>

NumPyの算術計算

# 要素ごとの足し算
print(x + y) #=> [ 3.  6.  9.]
# 引き算
print(x - y) #=> [-1. -2. -3.]
# 掛け算
print(x * y) #=> [  2.   8.  18.]
# 割り算
print(x / y) #=> [ 0.5  0.5  0.5]

配列のxとyの要素が同じでないとエラーになる。
要素ごとという言葉は、英語でelement-wiseと言う。
NumPy配列はelement_wiseな計算だけではなく、NumPy配列と単一の数値(スカラ値)の組み合わせで算術計算を行うこともできる。
その場合、NumPy配列の各要素とスカラ値の間で計算が行われます。この機能はブロードキャストと言います。

x = np.array(list_a)
print(x // 2.0) #=> [ 0.  1.  1.]

NumPyのN次元配列

NumPyは、1次元の配列(1列に並んだ配列)だけではなく、多次元の配列も作成することができる。
2次元配列(行列)は次のように作成できます。

A = np.array([[1, 2], [3, 4]])
print(A)
#=> [[1 2]
#    [3 4]]

# 形状
print(A.shape) #=> (2, 2)
# 要素のデータ型
print(A.dtype) #=> int64

行列の算術計算

B = np.array([[3, 0], [0, 6]])
print(A + B)
#=> [[ 4  2]
#    [ 3 10]]

print(A * B)
#=> [[ 3  0]
#    [ 0 24]]

また、行列に対してスカラ値(単一の数値)で算術計算を行うことも可能です。これもブロードキャストによる機能です。

print(A)
#=> [[1 2]
#    [3 4]]
print(A * 10)
#=> [[10 20]
#    [30 40]]

ブロードキャスト

10と言うスカラ値が2*2の要素に拡大されて演算が行われる機能を、 ブロードキャスト (broadcast)と言う。

A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print(A * B)
#=> [[10 40]
#    [30 80]]

各要素へのアクセス

要素のインデックスは、0から始まる。

# for文でアクセスすることも可能
for row in X:
    print(row)
#=> [51 55]
#   [14 19]
#   [0 4]

# 配列によって各要素にアクセス
X = X.flatten() # Xを1次元の配列へ変換
print(X) #=> [51 55 14 19  0  4]
# インデックスが0,2,4番目の要素を取得
print(X[np.array([0, 2, 4])]) #=> [51 14  0]

この記法を応用すれば、ある条件を満たす要素だけを取得することができる。

# 15以上の値だけを抽出
print(X > 15)  #=> [ True  True False  True False False]
print(X[X>15]) #=> [51 55 19]