この用語をシェア
概要
NumPy(Numerical Python)は、Pythonにおける科学技術計算の基盤となるライブラリです。高性能なN次元配列オブジェクト(ndarray)を中核とし、線形代数、フーリエ変換、乱数生成など、数値計算に必要な基本機能を包括的に提供します。C言語で実装されたコアエンジンにより、純粋なPythonコードと比較して大幅な処理速度の向上を実現し、データサイエンス、機械学習、科学技術分野における事実上の標準ライブラリとして位置づけられています。
N次元配列(ndarray)の特徴
高性能なメモリレイアウト
ndarrayは同一データ型の要素を連続したメモリ領域に格納する同質配列として設計されており、これにより以下の利点を提供します。
- メモリ効率性:Pythonリストに比べて大幅なメモリ使用量削減
- キャッシュ最適化:連続メモリアクセスによるCPUキャッシュ効率の向上
- ベクトル化処理:SIMD命令による並列処理の活用
- C言語レベル処理:低レベル最適化による高速計算
多次元配列操作
- 柔軟な次元構造:1次元ベクトルから高次元テンソルまで対応
- 形状変更(reshape):データを保持したまま配列構造を変換
- 次元操作:軸の追加、削除、転置、入れ替え
- インデックス・スライシング:高度な要素選択と部分配列抽出
ブロードキャスティング機能
NumPyの最も革新的な機能の一つであるブロードキャスティングは、異なる形状の配列間での効率的な演算を可能にします。
ブロードキャスティングの原理
- 形状互換性:最右軸から比較し、要素数が1または等しい場合に互換
- 自動拡張:小さい配列を大きい配列に合わせて仮想的に拡張
- メモリ効率:実際のデータ複製なしに演算を実行
- 要素単位演算:全要素に対する効率的な数学演算
数学・統計機能
基本数学関数
- 三角関数:sin, cos, tan とその逆関数
- 指数・対数:exp, log, log10, sqrt, power
- 双曲線関数:sinh, cosh, tanh
- 丸め関数:round, floor, ceil, trunc
統計・集約関数
- 基本統計:mean, median, std, var, min, max
- 分位数:percentile, quantile
- 相関・共分散:corrcoef, cov
- 軸指定集約:特定軸に沿った統計値計算
線形代数(numpy.linalg)
基本演算
- 行列積:dot, matmul(@演算子)による効率的な行列演算
- 転置・共役転置:transpose, conj
- ベクトルノルム:L1, L2, Frobenius ノルム
- 内積・外積:inner, outer, cross
高度な線形代数
- 固有値分解:eig, eigvals による固有値・固有ベクトル計算
- 特異値分解(SVD):svd による行列分解
- 連立方程式求解:solve, lstsq
- 行列式・逆行列:det, inv
実用的なコード例
基本的な配列操作
import numpy as np
# 各種配列の作成
zeros = np.zeros((3, 4)) # ゼロ行列
ones = np.ones((2, 3)) # 単位行列
arange = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1]
# 多次元配列の作成
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 形状情報の取得
print(f"形状: {matrix.shape}") # (3, 3)
print(f"次元数: {matrix.ndim}") # 2
print(f"要素数: {matrix.size}") # 9
print(f"データ型: {matrix.dtype}") # int64
# 形状変更と転置
reshaped = matrix.reshape(9, 1) # 9×1 列ベクトル
transposed = matrix.T # 転置行列
flattened = matrix.flatten() # 1次元配列に変換
ブロードキャスティングと数学演算
# ブロードキャスティングの例
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
vector = np.array([10, 20, 30])
# 行列 + ベクトル(ブロードキャスティング)
result = matrix + vector # [[11, 22, 33], [14, 25, 36]]
# 要素単位の数学演算
squared = matrix ** 2 # 二乗
sqrt_values = np.sqrt(matrix) # 平方根
exp_values = np.exp(matrix) # 指数関数
log_values = np.log(matrix) # 自然対数
# 統計計算
mean_all = np.mean(matrix) # 全体平均
mean_axis0 = np.mean(matrix, axis=0) # 列ごとの平均
mean_axis1 = np.mean(matrix, axis=1) # 行ごとの平均
std_dev = np.std(matrix) # 標準偏差
# 条件フィルタリング
mask = matrix > 3 # 真偽値配列
filtered = matrix[mask] # 条件を満たす要素
matrix_clipped = np.clip(matrix, 2, 5) # 値の範囲制限
線形代数の高速計算
# 線形代数演算の例
A = np.random.rand(3, 3)
B = np.random.rand(3, 3)
x = np.random.rand(3)
# 行列演算
matrix_product = A @ B # 行列積(Python 3.5+)
matrix_product = np.dot(A, B) # 行列積(従来方式)
determinant = np.linalg.det(A) # 行列式
inverse = np.linalg.inv(A) # 逆行列
# 固有値・固有ベクトル
eigenvalues, eigenvectors = np.linalg.eig(A)
# 特異値分解
U, s, Vt = np.linalg.svd(A)
# 連立方程式の解 (Ax = b)
b = np.random.rand(3)
solution = np.linalg.solve(A, b)
# ベクトル演算
vector_norm = np.linalg.norm(x) # ベクトルのノルム
inner_product = np.inner(x, x) # 内積
outer_product = np.outer(x, x) # 外積
# 最小二乗法
coefficients = np.linalg.lstsq(A, b, rcond=None)[0]
乱数生成と統計処理
# 現代的な乱数生成(NumPy 1.17+)
rng = np.random.default_rng(seed=42)
# 各種確率分布からのサンプリング
uniform_samples = rng.uniform(0, 1, 1000) # 一様分布
normal_samples = rng.normal(0, 1, 1000) # 正規分布
exponential_samples = rng.exponential(2, 1000) # 指数分布
poisson_samples = rng.poisson(3, 1000) # ポアソン分布
# サンプリング・シャッフル
data = np.arange(100)
shuffled = rng.permutation(data) # ランダム並び替え
sample = rng.choice(data, size=10, replace=False) # 非復元抽出
# 統計的要約
percentiles = np.percentile(normal_samples, [25, 50, 75])
correlation = np.corrcoef(uniform_samples, normal_samples)
covariance = np.cov(uniform_samples, normal_samples)
# ヒストグラム計算
hist, bin_edges = np.histogram(normal_samples, bins=50)
パフォーマンス最適化
ベクトル化の利点
- ループ除去:Pythonループを高速なC実装に置換
- 並列処理:BLAS/LAPACKによる自動並列化
- メモリ効率:中間結果の不要な複製を回避
- キャッシュ最適化:効率的なメモリアクセスパターン
メモリ管理のベストプラクティス
- 適切なデータ型選択:float32 vs float64 の使い分け
- インプレース演算:新しい配列作成を避ける操作
- ビュー vs コピー:メモリ共有の理解
- 事前メモリ確保:配列サイズの動的拡張を避ける
エコシステムとの連携
データサイエンスライブラリ
- Pandas:構造化データ処理の基盤として活用
- Matplotlib/Seaborn:可視化ライブラリでの配列データ処理
- SciPy:科学技術計算の拡張機能
- Statsmodels:統計モデリングでの数値処理
機械学習フレームワーク
- scikit-learn:機械学習アルゴリズムの配列インターフェース
- TensorFlow:テンソル操作とNumPy配列の相互変換
- PyTorch:torch.Tensorとndarrayの統合
- XGBoost/LightGBM:勾配ブースティングでの前処理
応用分野
- データサイエンス:大規模データセットの前処理・統計分析
- 機械学習・AI:特徴量行列、重みパラメータの効率的計算
- 画像処理:ピクセルデータの配列操作・フィルタリング
- 信号処理:フーリエ変換、デジタルフィルタ設計
- 金融工学:リスク分析、ポートフォリオ最適化、デリバティブ価格計算
- 科学技術シミュレーション:数値解析、有限要素法、流体力学
- 暗号学・セキュリティ:大素数演算、暗号化アルゴリズム
最新バージョン情報
NumPy 1.25/1.26系では、以下のような重要なアップデートが行われています:
- 型アノテーション強化:静的型チェック対応の改善
- 新しい数学関数:統計・特殊関数の追加
- NEP 47準拠:Array APIスタンダード対応
- パフォーマンス向上:SIMD最適化とメモリ使用量削減
- F2PY改善:Fortranとの連携機能強化
- 互換性維持:Python 3.9-3.12サポート
メリット・デメリット
メリット
- 純粋Pythonに比べて圧倒的な計算速度
- メモリ効率的な配列実装
- 豊富な数学・統計関数ライブラリ
- 直感的で表現力の高いAPI
- 科学技術計算エコシステムの基盤
- 成熟したコミュニティと豊富な情報
デメリット
- ブロードキャスティング規則の学習コスト
- ビューとコピーの違いによる予期しない動作
- 異なるデータ型の混在による型変換問題
- 大容量配列での sudden memory allocation
