概要(ベクトル演算は「配列同士を一発で計算」できる最短ルート)
NumPyのベクトル演算は、forループを使わずに配列(一次元配列=ベクトル)をまとめて計算します。足し算・引き算・要素ごとの掛け算、内積、ノルム(長さ)、角度、ブロードキャストによる形の違う配列の計算まで、短いコードで高速に書けます。初心者は「ndarrayの作り方」「要素ごとの演算」「内積・ノルム」「ブロードキャスト」の4つを押さえれば、実務で困りません。
ベクトルの作成と基本演算(足し算・スカラー演算・要素ごとの演算)
1次元配列(ベクトル)を作る最小例
import numpy as np
a = np.array([1, 2, 3], dtype=np.float64) # ベクトル(一次元配列)
b = np.array([4, 5, 6], dtype=np.float64)
Pythondtypeは数値計算ならfloat64が無難です。整数でも構いませんが、割り算などで意図せぬ型変換が起きにくいのはfloatです。
ベクトル同士の四則演算(要素ごと)
print(a + b) # [5, 7, 9]
print(a - b) # [-3, -3, -3]
print(a * b) # [4, 10, 18]
print(a / b) # [0.25, 0.4, 0.5]
Python演算子は“要素ごと”の計算です。Pythonのforは不要です。
スカラーとの演算(ベクトルの全要素に適用)
print(a + 10) # [11, 12, 13]
print(a * 2) # [2, 4, 6]
Pythonスカラー(単一の数)との四則演算は、全部の要素に一括で適用されます。
ベクトルの内積・ノルム・角度(幾何学の基本を一行で)
内積(dot)で「方向の似ている度合い」を測る
a = np.array([1, 2, 3], dtype=np.float64)
b = np.array([4, 5, 6], dtype=np.float64)
dot = np.dot(a, b) # 1*4 + 2*5 + 3*6 = 32
print(dot)
Python内積は「同じ方向なら大きく、逆なら小さく(負になり得る)」になります。類似度や射影などの基礎です。
ノルム(長さ)で“ベクトルの大きさ”を知る
norm_a = np.linalg.norm(a) # √(1^2 + 2^2 + 3^2)
print(norm_a)
Python正規化(単位ベクトル化)や距離計算の前提になります。
角度(cosθ)を内積から求める
cos_theta = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
theta_rad = np.arccos(np.clip(cos_theta, -1.0, 1.0)) # ラジアン
theta_deg = np.degrees(theta_rad)
print(theta_deg)
Pythonnp.clipで丸めるのは、浮動小数の誤差対策です。方向の違いを定量化できます。
3次元の外積(垂直なベクトルを求める)
c = np.cross(a, b) # R^3で有効
print(c)
Python外積は二つのベクトルに直交するベクトル(面の法線)を返します。順序で向きが変わります。
ブロードキャストの基礎(形が違っても「自然に」計算する)
行ベクトルと列ベクトルを足してグリッドを作る
x = np.array([1, 2, 3]) # 形状: (3,)
y = np.array([10, 20, 30, 40]) # 形状: (4,)
X = x[:, None] # (3, 1) 列ベクトル化
Y = y[None, :] # (1, 4) 行ベクトル化
grid = X + Y # (3, 4) の配列に拡張して足し算
print(grid)
Python「足りない次元に1を入れる」と自動拡張(ブロードキャスト)されます。None(np.newaxis)で次元追加が合図です。
例:重心移動(ベクトルを一括で平行移動)
points = np.array([[0, 1], [2, 3], [4, 5]], dtype=np.float64) # N×2
shift = np.array([10, -2], dtype=np.float64) # 2次元ベクトル
moved = points + shift # 全点を平行移動
print(moved)
Python列数が一致すれば、全行に同じベクトルを足し込めます。ループ不要です。
マスクと条件演算(抽出・置換を「配列のまま」行う)
ブールマスクで抽出
v = np.array([3, -1, 5, 0, -2], dtype=np.float64)
pos = v[v > 0] # 正の要素だけ抽出
print(pos)
Python条件式がそのまま配列のフィルタになります。
whereで条件置換(負の値を0にする等)
clipped = np.where(v < 0, 0.0, v)
print(clipped)
Python分岐をループで書かずに、配列全体で置換できます。
スタック・整形・距離計算(実務でよく使う型)
ベクトルの結合(縦・横)
a = np.array([1, 2, 3], dtype=np.float64)
b = np.array([4, 5, 6], dtype=np.float64)
vstacked = np.vstack([a, b]) # 2×3(縦に積む)
hstacked = np.hstack([a, b]) # 長さ6(横に並べる)
print(vstacked.shape, hstacked.shape)
PythonDataFrameにする前の配列操作で便利です。
正規化(長さ1へ)と安全な除算
x = np.array([3, 4], dtype=np.float64)
norm = np.linalg.norm(x)
unit = x / (norm if norm != 0 else 1) # ゼロ除算回避
print(unit)
Python単位ベクトル化は方向特徴量の基礎です。
全ペア距離をベクトル化で一括計算
P = np.array([[0,0],[1,0],[0,1]], dtype=np.float64) # 3×2
Q = np.array([[1,1],[2,2]], dtype=np.float64) # 2×2
diff = P[:, None, :] - Q[None, :, :] # 3×2×2
dist = np.sqrt((diff**2).sum(axis=2)) # 3×2 の距離行列
print(dist)
Python二重ループを使わずに、ブロードキャストで距離行列が出せます。
つまずき対策の深掘り(形状・dtype・コピー・速度設計)
形状エラーは「軸の数」と「末尾次元の一致」を確認する
ブロードキャストは「後ろから見て、同じか1の次元だけ拡張」できます。必要なら [:, None] や [None, :] を使って次元を整えます。
dtypeを揃える(混在で暗黙変換・精度劣化・遅さの原因)
float64で統一すると、割り算・平方根・三角関数が素直に動きます。整数同士の除算は意図と違う結果を産みがちなので注意。
スライスはビュー(コピーを減らして速く・軽く)
v = np.arange(10, dtype=np.float64)
sub = v[2:8] # ビュー(同じメモリを参照)
sub[:] = 0 # vにも反映される
不要なコピーは避け、必要なときだけ copy() を使います。
まとめて計算する(ベクトル化で速度が桁違い)
ループで一個ずつ処理せず、配列演算・集約関数(sum/mean)・線形代数API(dot/@/norm)に寄せると高速です。中間配列は out= や in-place(x += 1)で減らします。
例題(短いコードで“役に立つ”ベクトル処理を体に入れる)
コサイン類似度で類似度ランキング
import numpy as np
# ベクトル群(例:特徴量)
X = np.array([[1,2,3],[2,0,1],[0,1,0]], dtype=np.float64)
q = np.array([1,1,1], dtype=np.float64)
# 正規化して内積=コサイン類似度
X_norm = X / np.linalg.norm(X, axis=1, keepdims=True)
q_norm = q / np.linalg.norm(q)
scores = X_norm @ q_norm # 各行との類似度
rank = np.argsort(scores)[::-1]
print(scores, rank)
Python正規化→内積で「方向の近さ」を高速に評価できます。
2D点群のスケーリングと回転を一括適用
pts = np.array([[1,0],[0,1],[1,1]], dtype=np.float64)
scale = 2.0
theta = np.deg2rad(30)
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]], dtype=np.float64)
out = (pts * scale) @ R.T # スケール→回転(行列積)
print(out)
Python行列積で幾何変換をまとめて適用。ループ不要で読みやすく高速です。
しきい値でクリップしてからzスコア標準化
x = np.array([10, 12, 300, 8, 15], dtype=np.float64)
x = np.clip(x, 0, 100) # 0〜100に制限(外れ値対策)
z = (x - x.mean()) / x.std() # 一括で標準化
print(z)
Python前処理の定石をベクトル演算で一発処理できます。
まとめ(「要素ごとの演算」「内積・ノルム」「ブロードキャスト」を型にする)
ベクトル演算の肝は、配列を作って演算子で一括処理することです。四則演算は要素ごと、内積・ノルムで関係と大きさを掴む、ブロードキャストで形が違っても自然に計算する。マスク・whereで条件処理、行列積で変換をまとめて適用。dtype統一・ビュー活用・ベクトル化徹底で、初心者でも“短く速く正確な”ベクトルコードが安定して書けます。
