Python NumPyで行列操作:転置、加算、乗算、スライシング – 実践ガイド
Python NumPyで行列操作:転置、加算、乗算、スライシング – 実践ガイド
数学的モデリング、科学計算、データ分析では、二次元データの効率的な操作が頻繁に必要になります。Pythonでは行列をネストしたリストで作成できますが、より強力なのはNumPyライブラリです。このガイドでは最も一般的な行列操作を、明確なコード例とベストプラクティスとともに解説します。
行列とは?
行列は、数値(または他のデータ型)を縦横に配置した長方形の配列です。Pythonコア言語には専用の行列型はありませんが、ネストしたリストまたはNumPyのndarrayで表現できます。後者は高速なベクトル化演算を提供します。
ネストしたリストで行列を作成
ネストしたリストは行列構築の最もシンプルな方法。各内部リストが1行を表します:
# 3x3行列
M1 = [[8, 14, -6],
[12, 7, 4],
[-11, 3, 21]]
print(M1)
出力:
[[8, 14, -6], [12, 7, 4], [-11, 3, 21]]
データの読み取り
行と列のインデックスで要素にアクセス。各行の最後の要素を出力:
for row in M1:
print(row[-1])
出力:
-6 4 21
行列の加算
両行列が同じ形状なら要素ごとの加算は直感的:
M2 = [[3, 16, -6],
[9, 7, -4],
[-1, 3, 13]]
# 結果行列
M3 = [[M1[i][j] + M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
出力:
[[11, 30, -12], [21, 14, 0], [-12, 6, 34]]
要素ごとの乗算
同様に対応する要素を乗算:
M3 = [[M1[i][j] * M2[i][j] for j in range(len(M1[0]))] for i in range(len(M1))]
print(M3)
出力:
[[24, 224, 36], [108, 49, -16], [11, 9, 273]]
NumPyでの効率的な行列操作
NumPyは専用配列型と豊富なベクトル化操作を提供。pip install numpyでインストールし、npとしてインポート:
import numpy as np
行列の作成
M1 = np.array([[5, -10, 15],
[3, -6, 9],
[-4, 8, 12]])
print(M1)
出力:
[[ 5 -10 15] [ 3 -6 9] [-4 8 12]]
基本操作
- 加算:
M3 = M1 + M2 - 減算:
M3 = M1 - M2 - ドット積(行列乗算):
M3 = M1.dot(M2) - 転置:
M2 = M1.transpose()
例: 行列ドット積
M1 = np.array([[3, 6], [5, -10]])
M2 = np.array([[9, -18], [11, 22]])
print(M1.dot(M2))
出力:
[[ 93 78] [-65 -310]]
スライシング
array[行開始:行終了, 列開始:列終了]で行と列をスライス:
M = np.array([[2, 4, 6, 8, 10],
[3, 6, 9, -12, -15],
[4, 8, 12, 16, -20],
[5, -10, 15, -20, 25]])
print(M[1:3, 1:4]) # 行1-2、列1-3
print(M[:, 3]) # 全行、4列目
print(M[:1, :]) # 1行目、全列
print(M[:3, :2]) # 最初の3行、最初の2列
出力:
[[ 6 9 -12] [ 8 12 16]] [ 8 -12 16 -20] [[ 2 4 6 8 10]] [[ 2 4] [ 3 6] [ 4 8]]
行と列へのアクセス
# 行
print(M[0]) # 最初の行
print(M[-1]) # 最後の行
# 列
print(M[:, 0]) # 最初の列
print(M[:, -1]) # 最後の列
重要なポイント
- Pythonのリストのリストは小さな行列には十分だが、NumPyの
ndarrayの方がはるかにスケールする - 要素ごとの演算(+, -, *, /)はNumPy配列で直接動作
- 真の行列乗算には
np.dot()または@演算子を使用 - スライシングで部分配列や特定行/列の強力な抽出が可能
- 演算前に行列の形状互換性を常に確認
Python
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python print()関数の実践ガイド:基本から応用まで
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Pythonラムダ関数をマスターする:実例とベストプラクティス
- Python abs()関数:数値と複素数の絶対値を計算
- Python round()関数を実例で徹底解説
- Python range()関数をマスター:基礎から応用まで
- Python map()関数をマスター:構文、例、ベストプラクティス