[NumPy] 配列の演算規則

[NumPy] 配列の演算規則

配列の演算規則

配列と数値の演算

 準備として 2 × 2 の配列 x を生成しておきます。

# リストA-1

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

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

# 2×2の配列を作成
x = np.array([row1, row2])

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

 
 配列 (ndarrayオブジェクト) + 1 という操作は、配列の全要素に 1 を加えることを意味します。

# リストA-2

# 配列x
# [[1 2]
#  [3 4]]

# 配列xに1を加える
print(x + 1)
[[2 3]
 [4 5]]

 
 同様に引き算や掛け算、割り算も全ての要素に作用します。

# リストA-3

# 配列x
# [[1 2]
#  [3 4]]

# 配列xから1を引く
print(x - 1)

# 配列xに2を掛ける
print(x * 2)

# 配列xを2で割る
print(x / 2)
[[0 1]
 [2 3]]
 
[[2 4]
 [6 8]]
 
[[0.5 1. ]
 [1.5 2. ]]

 割り算を実行したときに、一部の要素は小数点を含む数値となります。このとき他の要素もすべて浮動小数点数型 (float) に揃えられます。ndarrayオブジェクトは異なる型の要素をもつことができないからです。
 

配列同士の演算

 次のように同じ形をした配列 x と y を定義します。

# リストB-1

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

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

# 2×2の配列xを作成
x = np.array([row1, row2])

# 全要素が2の配列yを作成
y = 2 * np.ones(4, dtype = int).reshape(2, 2)

print(x)
print(y)
[[1 2]
 [3 4]]
 
[[2 2]
 [2 2]]

 
 配列同士の四則演算(加減乗除)は同じインデックスの要素同士で実行されます

# リストB-2

# 配列x
# [[1 2]
#  [3 4]]

# 配列y
# [[2 2]
#  [2 2]]

# 配列同士の加算
print(x + y)

# 配列の減算
print(x - y)

# 配列の積
print(x * y)

# 配列の除算
print(x / y)
[[3 4]
 [5 6]]
 
[[-1 0]
 [ 1 2]]
 
[[2 4]
 [6 8]]
 
[[0.5 1. ]
 [1.5 2. ]

 
 べき乗・切り捨て除算・剰余算も要素同士で実行されます。

# リストB-3

# 配列x
# [[1 2]
#  [3 4]]

# 配列y
# [[2 2]
#  [2 2]]

# 配列のべき乗
print(x ** y)

# 配列の切り捨て除算
print(x // y)

# 配列の剰余算
print(x % y)
[[ 1 4]
 [ 9 16]]
 
[[0 1]
 [1 2]]
 
[[1 0]
 [1 0]]

 

行列積

 NumPy には線型代数学という分野で扱われる行列積を実行するメソッド x.dot(y) が用意されています (x と y は任意の配列)。たとえば 2 × 2 の行列同士の行列積は
 
\[AB=\begin{pmatrix}a & b\\ c & d\end{pmatrix}
\begin{pmatrix}
e & f\\ g & h\end{pmatrix}=
\begin{pmatrix}ae+bg & af+bh\\
ce+dg & cf+dh\end{pmatrix}\]
のように定義されています。NumPy で行列積
 
\[\begin{pmatrix}1 & 2\\ 3 & 4\end{pmatrix}
\begin{pmatrix}1 & 2\\ 2 & 1\end{pmatrix}\]
を計算させてみましょう。

# リストC-1
# dot()メソッドによる行列積の計算

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

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

y = np.array([[1, 2],
              [2, 1]])

# 行列積xyを計算
print(x.dot(y))
[[ 5 4]
 [11 10]]

 Python 3.5 以降では @演算子を使って行列積を計算できるようになりました。

# リストC-2
# @演算子による行列積の計算

# 配列x
# [[1 2]
# [3 4]]

# 配列y
# [[1 2]
# [2 1]]

print(x @ y)
[[ 5 4]
 [11 10]]