【Python】NumPyによるベクトルの演算一覧:四則演算から内積・外積まで

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 と書くことができ、数式に近い表現が可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次