Python | データ処理:ベクトル演算

Python
スポンサーリンク
  1. 概要(ベクトル演算は「配列同士を一発で計算」できる最短ルート)
  2. ベクトルの作成と基本演算(足し算・スカラー演算・要素ごとの演算)
    1. 1次元配列(ベクトル)を作る最小例
    2. ベクトル同士の四則演算(要素ごと)
    3. スカラーとの演算(ベクトルの全要素に適用)
  3. ベクトルの内積・ノルム・角度(幾何学の基本を一行で)
    1. 内積(dot)で「方向の似ている度合い」を測る
    2. ノルム(長さ)で“ベクトルの大きさ”を知る
    3. 角度(cosθ)を内積から求める
    4. 3次元の外積(垂直なベクトルを求める)
  4. ブロードキャストの基礎(形が違っても「自然に」計算する)
    1. 行ベクトルと列ベクトルを足してグリッドを作る
    2. 例:重心移動(ベクトルを一括で平行移動)
  5. マスクと条件演算(抽出・置換を「配列のまま」行う)
    1. ブールマスクで抽出
    2. whereで条件置換(負の値を0にする等)
  6. スタック・整形・距離計算(実務でよく使う型)
    1. ベクトルの結合(縦・横)
    2. 正規化(長さ1へ)と安全な除算
    3. 全ペア距離をベクトル化で一括計算
  7. つまずき対策の深掘り(形状・dtype・コピー・速度設計)
    1. 形状エラーは「軸の数」と「末尾次元の一致」を確認する
    2. dtypeを揃える(混在で暗黙変換・精度劣化・遅さの原因)
    3. スライスはビュー(コピーを減らして速く・軽く)
    4. まとめて計算する(ベクトル化で速度が桁違い)
  8. 例題(短いコードで“役に立つ”ベクトル処理を体に入れる)
    1. コサイン類似度で類似度ランキング
    2. 2D点群のスケーリングと回転を一括適用
    3. しきい値でクリップしてからzスコア標準化
  9. まとめ(「要素ごとの演算」「内積・ノルム」「ブロードキャスト」を型にする)

概要(ベクトル演算は「配列同士を一発で計算」できる最短ルート)

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)
Python

dtypeは数値計算なら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)
Python

np.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)
Python

DataFrameにする前の配列操作で便利です。

正規化(長さ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統一・ビュー活用・ベクトル化徹底で、初心者でも“短く速く正確な”ベクトルコードが安定して書けます。

タイトルとURLをコピーしました