NumPyにおける行列・ベクトル演算の核心:dot関数の実践的解説

NumPyは、Pythonによる数値計算の基盤となるライブラリであり、配列同士の線形代数演算を効率的に実行するための豊富な機能を提供します。その中でもnp.dotは、ベクトルの内積や行列の乗算といった基本かつ重要な操作を統一的なインターフェースで実現する関数です。この関数の挙動は入力配列の形状に応じて自動的に切り替わり、柔軟性と一貫性を兼ね備えています。

基本構文と動作原理

np.dotの呼び出し形式は以下の通りです:

import numpy as np
result = np.dot(x, y)

ここでxyは任意の次元のNumPy配列(ndarray)であり、out引数を用いて事前に確保した出力バッファを指定することも可能です。ただし、ほとんどのケースでは省略可能です。

形状に応じた挙動の具体例

1. 1次元配列同士:内積(スカラー出力)

長さが一致する1次元配列同士では、対応要素の積の総和が返されます。

v1 = np.array([2, -1, 4])
v2 = np.array([3, 0, 1])
inner_product = np.dot(v1, v2)  # → 2*3 + (-1)*0 + 4*1 = 10
print(inner_product)  # 出力: 10

2. 2次元 × 1次元:行列とベクトルの積(1次元出力)

行列(m×n)と長さnのベクトルの組み合わせでは、各行列行とベクトルの内積が結果ベクトルの成分となります。

matrix = np.array([[1, 5, 2],
                   [0, 3, 7]])
vector = np.array([2, 1, 3])
product = np.dot(matrix, vector)  # → [1*2+5*1+2*3, 0*2+3*1+7*3] = [13, 24]
print(product)  # 出力: [13 24]

3. 2次元 × 2次元:標準的な行列乗算(2次元出力)

行列A(m×n)と行列B(n×p)の積は、m×pの行列として得られます。

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
C = np.dot(A, B)  # → [[19, 22], [43, 50]]
print(C)
# 出力:
# [[19 22]
#  [43 50]]

次元整合性のルール

  • 1次元入力ペア:両者の長さが等しい必要がある(例:(n,) @ (n,) → スカラー)
  • 行列×ベクトル:行列の列数=ベクトルの長さ(例:(m,n) @ (n,) → (m,)
  • ベクトル×行列:ベクトルの長さ=行列の行数(例:(n,) @ (n,p) → (p,)
  • 行列×行列:左行列の列数=右行列の行数(例:(m,n) @ (n,p) → (m,p)

代替記法と補足

Python 3.5以降では、@演算子がnp.dotのエイリアスとして定義されており、コードの可読性を高めます:

# 以下は等価
np.dot(X, Y)
X @ Y

また、np.matmul関数も同様の目的で使用されますが、np.dotとは異なり、3次元以上の配列に対して「バッチ行列乗算」をサポートします。単純な2次元演算には両者に差はありません。

タグ: NumPy linear-algebra matrix-multiplication

6月10日 22:26 投稿