NumPyを使用すると、ベクトルの足し算や引き算などの要素ごとの計算(Element-wise)から、線形代数で重要となる内積や外積までを直感的に記述できます。
特に注意が必要なのは「掛け算」です。Pythonの * 演算子は「アダマール積(要素ごとの掛け算)」であり、「内積(ドット積)」ではない点に気をつける必要があります。
目次
実行可能なサンプルコード
ベクトル $\vec{a} = [1, 2, 3]$ と $\vec{b} = [4, 5, 6]$ を用いた全パターンの実装例です。
import numpy as np
def vector_operations_demo():
# ベクトルの定義
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
scalar = 10
print(f"Vector a: {a}")
print(f"Vector b: {b}")
print("-" * 30)
# 1. 足し算 (Vector Addition)
# 要素同士を足す: [1+4, 2+5, 3+6]
add = a + b
print(f"1. 足し算 (a + b): {add}")
# 2. 引き算 (Vector Subtraction)
# 要素同士を引く: [1-4, 2-5, 3-6]
sub = a - b
print(f"2. 引き算 (a - b): {sub}")
# 3. 掛け算スカラー積 (Scalar Multiplication)
# 全要素を定数倍する: [1*10, 2*10, 3*10]
mul_scalar = a * scalar
print(f"3. スカラー倍 (a * 10): {mul_scalar}")
# 4. 割算スカラー積 (Scalar Division)
# 全要素を定数で割る
div_scalar = a / scalar
print(f"4. スカラー除算 (a / 10): {div_scalar}")
# 5. 掛け算アダマール積 (Hadamard Product / Element-wise Multiplication)
# 同じ位置の要素同士を掛ける: [1*4, 2*5, 3*6]
# ※ 行列の積ではないことに注意
hadamard_mul = a * b
print(f"5. アダマール積 (a * b): {hadamard_mul}")
# 6. 割算アダマール積 (Element-wise Division)
# 同じ位置の要素同士で割る
hadamard_div = a / b
print(f"6. 要素ごとの割算 (a / b): {hadamard_div}")
# 7. 内積 (Dot Product)
# 対応する成分の積の和: 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32
# np.dot(a, b) または @ 演算子を使用
dot_prod = np.dot(a, b)
dot_prod_op = a @ b
print(f"7. 内積 (np.dot / @): {dot_prod}")
# 8. 外積 (Cross Product)
# 2つのベクトルに直交するベクトルを生成(主に3次元で使用)
cross_prod = np.cross(a, b)
print(f"8. 外積 (np.cross): {cross_prod}")
if __name__ == "__main__":
vector_operations_demo()
演算方法まとめ
Python(NumPy)における演算子の意味は以下の通りです。
| 演算の種類 | 数学的意味 | Python演算子 / 関数 |
| 足し算 | $\vec{a} + \vec{b}$ | a + b |
| 引き算 | $\vec{a} – \vec{b}$ | a - b |
| スカラー倍 | $k \vec{a}$ | a * k |
| アダマール積 | $[a_1 b_1, a_2 b_2, …]$ | a * b (直感的だが注意) |
| 内積 | $\vec{a} \cdot \vec{b}$ | np.dot(a, b) または a @ b |
| 外積 | $\vec{a} \times \vec{b}$ | np.cross(a, b) |
補足:内積計算の @ 演算子について
Python 3.5以降では、行列積や内積を表すための専用演算子 @ が導入されました。
np.dot(a, b) と書く代わりに a @ b と書くことができ、数式に近い表現が可能です。
