NumPy入門:統計分析向けの配列操作と数値計算

NumPyは、Pythonにおける科学技術計算の基盤ライブラリであり、特に統計処理や大規模な数値演算において不可欠なツールです。以下では、配列の生成・変形・演算・ブロードキャスト・集計など、統計実務で頻出する基本操作を実践的に解説します。

配列の形状管理

NumPyの核心はndarray(N次元配列)です。形状(shape)は、各次元のサイズをタプルで表します。

# 基本的な配列作成
import numpy as np

vector_1d = np.array([7, 12, 5])
matrix_2d = np.arange(12).reshape(3, 4)
tensor_3d = np.ones((2, 3, 4)) * 3.14

print("1次元配列:", vector_1d.shape)   # (3,)
print("2次元配列:", matrix_2d.shape)   # (3, 4)
print("3次元配列:", tensor_3d.shape)   # (2, 3, 4)

形状の再構成(reshape)

`.reshape()`は、要素数を保ったまま配列の次元構造を変更します。-1を指定すると、自動で推論されます。

data = np.array([10, 20, 30, 40, 50, 60])

# 2×3行列に変形
grid_a = data.reshape(2, 3)
# 列ベクトル(6×1)
col_vec = data.reshape(-1, 1)
# 行ベクトル(1×6)
row_vec = data.reshape(1, -1)

print("2×3:\n", grid_a)
print("列ベクトル:\n", col_vec)

要素単位の演算と条件抽出

NumPyでは、スカラーとの四則演算や関数適用が全要素に自動適用されます。また、ブーリアンインデックスによりフィルタリングが簡潔に行えます。

sample = np.array([[1, 8, 3],
                  [9, 2, 7]])

# 要素ごとの対数変換(自然対数)
log_sample = np.log(sample.astype(float))

# 条件付き抽出:2より大きい値のみ
mask = sample > 5
filtered = sample[mask]

# 行・列の選択
first_row = sample[0, :]      # 1行目すべて
second_col = sample[:, 1]     # 2列目すべて

print("対数変換結果:\n", log_sample)
print("条件抽出:", filtered)

配列の分割と結合

水平方向(`np.hstack`)・垂直方向(`np.vstack`)での結合、およびスライスによる分割が可能です。

base = np.arange(10).reshape(2, 5)

# 左右に分割(列方向)
left_part = base[:, :2]
right_part = base[:, 2:]

# 水平結合(列方向)
merged_h = np.hstack([left_part, right_part])

# 垂直結合(行方向)
stacked_v = np.vstack([base, base * 2])

print("分割後左:", left_part.shape)
print("水平結合結果:", merged_h.shape)

行列演算と線形代数

要素同士の積(`*`)と行列積(`.dot()`または`@`)は明確に区別されます。`np.linalg`モジュールでは逆行列・固有値なども利用可能です。

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])

# アダマール積(要素ごと)
hadamard = A * B

# 行列積
matmul = A @ B  # または A.dot(B)

# 逆行列(存在する場合)
if np.linalg.det(A) != 0:
    inv_A = np.linalg.inv(A)
    print("Aの逆行列:\n", inv_A)

ブロードキャスト:異なる形状の配列間演算

形状が異なる配列どうしの演算でも、NumPyは自動的に「拡張」して互換性を持たせます。これは統計処理における標準化や偏差計算に極めて有用です。

# 4×3行列と1×3行ベクトルの加算
X = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9],
              [10, 11, 12]])
offset = np.array([[10, 20, 30]])  # shape: (1, 3)

result = X + offset  # offsetが4行に自動複製される
print("ブロードキャスト加算結果:\n", result)

# 同様に、4×3と4×1の加算も可能(列方向の拡張)
col_offset = np.array([[100], [200], [300], [400]])
result_v = X + col_offset

統計集計関数

`axis`パラメータで集計方向を指定できます。`axis=0`は列方向(各列の統計)、`axis=1`は行方向(各行の統計)を意味します。

data_matrix = np.array([[2, 4, 6],
                        [1, 5, 9],
                        [3, 3, 3]])

print("全体平均:", np.mean(data_matrix))
print("列ごとの平均:", np.mean(data_matrix, axis=0))
print("行ごとの合計:", np.sum(data_matrix, axis=1))
print("各列の標準偏差:", np.std(data_matrix, axis=0, ddof=1))

タグ: NumPy scientific-computing python-statistics Array-Processing broadcasting

5月27日 00:38 投稿