NumPy チュートリアル - NumPy 数学演算とブロードキャスト

この章では、基本的な算術演算や行列演算など、NumPy での演算について説明します。
基本的な算術演算から始めましょう。
NumPy 算術演算
加算、減算、乗算、除算は、NumPy で最も基本的な算術演算です。これらは、数値間の通常の算術演算に似ています。
import numpy as np
arrayA = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
arrayB = arrayA.T
#array([[1, 2, 3],
# [4, 5, 6],
# [7, 8, 9]])
arrayB = arrayA.T
#array([[1, 4, 7],
# [2, 5, 8],
# [3, 6, 9]])
arrayA + arrayB
#array([[ 2, 6, 10],
# [ 6, 10, 14],
# [10, 14, 18]])
arrayA - arrayB
#array([[ 0, -2, -4],
# [ 2, 0, -2],
# [ 4, 2, 0]])
arrayA * arrayB
#array([[ 1, 8, 21],
# [ 8, 25, 48],
# [21, 48, 81]])
arrayA / arrayB
#array([[1. , 0.5 , 0.42857143],
# [2. , 1. , 0.75 ],
# [2.33333333, 1.33333333, 1. ]])
行列の乗算操作-*
は、2つの配列の同じ位置にある要素を乗算して、結果の配列の同じ位置にある要素を取得することに注意してください。np.dot
メソッドで計算されるのは、与えられた 2つの配列のドット積ではありません。
np.dot(arrayA, arrayB)
#array([[ 14, 32, 50],
# [ 32, 77, 122],
# [ 50, 122, 194]])
NumPy Broadcasting
2つの配列は、配列演算操作で同じ形状にする必要があります。しかし、NumPy は、ブロードキャストの概念を導入して、2つの配列の形状が同じでない場合、可能であれば配列を自動入力します。
この概念を例で説明しましょう。
import numpy as np
arrayA = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
arrayA + 1
#array([[ 2, 3, 4],
# [ 5, 6, 7],
# [ 8, 9, 10]])
ここでは、arrayA
のすべての要素に 1
が追加されます。つまり、1
は形状 (1,1)
から同じ形状の arrayA
-(3、3
にブロードキャストされます。 ) 配列の追加操作を可能にします。
実際の操作は次のとおりです。
arrayA + np.array([[1,1,1],[1,1,1],[1,1,1]])
NumPy でのブロードキャストは、以下のシナリオでも使用できますが、
2つの配列は 1つの次元で同じ長さを持ち、1つの配列は他の次元で 1 と同じ長さを持ちます
1つの例から始めましょう。
arrayC = np.array([10, 11, 12])
arrayA + arrayC
#array([[11, 13, 15],
# [14, 16, 18],
# [17, 19, 21]])
arryA
の形状は (3, 3)
であり、arrayC
の形状は (3, 1)
です。これは配列の次元の基準を満たし、arrayC
の単一行のデータは arrayA
の形状に一致するように 3 行にブロードキャストされます。
2つの配列の行の長さが同じ場合にも適用できます。
arrayD = np.array([[10],[11],[12]])
#array([[10],
# [11],
# [12]])
arrayA + arrayD
#array([[11, 12, 13],
# [15, 16, 17],
# [19, 20, 21]])
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn