NumPy配列で三角行列を自在に操作!tril・triu・triの使い方完全ガイド
NumPyで行列計算を行う際、下三角行列や上三角行列を扱うことは非常に多くあります。本記事では、NumPyのtril、triu、tri関数を使った三角行列の抽出・生成方法を、豊富なサンプルコードとともに詳しく解説します。
三角行列とは?
三角行列は、対角線を境界として一方の要素がすべて0になっている正方行列です。
- 下三角行列(Lower triangular matrix): 対角線より上の要素が0
- 上三角行列(Upper triangular matrix): 対角線より下の要素が0
1. numpy.tril() – 下三角行列の抽出
numpy.tril()関数は、配列の下三角部分を抽出し、上三角部分を0で埋めます。
基本的な使用方法
import numpy as np
# 3x3の行列を作成
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 下三角行列を抽出
lower = np.tril(matrix)
print(lower)
# [[1 0 0]
# [4 5 0]
# [7 8 9]]
オフセット(k)パラメータの活用
# k=1: 主対角線より1つ上まで含める
lower_k1 = np.tril(matrix, k=1)
print(lower_k1)
# [[1 2 0]
# [4 5 6]
# [7 8 9]]
# k=-1: 主対角線を除外
lower_k_minus1 = np.tril(matrix, k=-1)
print(lower_k_minus1)
# [[0 0 0]
# [4 0 0]
# [7 8 0]]
2. numpy.triu() – 上三角行列の抽出
numpy.triu()関数は、配列の上三角部分を抽出し、下三角部分を0で埋めます。
基本的な使用方法
# 上三角行列を抽出
upper = np.triu(matrix)
print(upper)
# [[1 2 3]
# [0 5 6]
# [0 0 9]]
オフセット(k)パラメータの活用
# k=1: 主対角線を除外
upper_k1 = np.triu(matrix, k=1)
print(upper_k1)
# [[0 2 3]
# [0 0 6]
# [0 0 0]]
# k=-1: 主対角線より1つ下まで含める
upper_k_minus1 = np.triu(matrix, k=-1)
print(upper_k_minus1)
# [[1 2 3]
# [4 5 6]
# [0 8 9]]
3. numpy.tri() – 三角行列の生成
numpy.tri()関数は、指定したサイズの下三角行列(1で埋められた)を生成します。
基本的な使用方法
# 4x4の下三角行列を生成
tri_matrix = np.tri(4)
print(tri_matrix)
# [[1. 0. 0. 0.]
# [1. 1. 0. 0.]
# [1. 1. 1. 0.]
# [1. 1. 1. 1.]]
非正方形の三角行列
# 3x5の三角行列を生成
tri_3x5 = np.tri(3, 5)
print(tri_3x5)
# [[1. 0. 0. 0. 0.]
# [1. 1. 0. 0. 0.]
# [1. 1. 1. 0. 0.]]
データ型とオフセットの指定
# 整数型でオフセット1の三角行列
tri_int = np.tri(3, dtype=int, k=1)
print(tri_int)
# [[1 1 0]
# [1 1 1]
# [1 1 1]]
4. 実践的な活用例
4-1. 対角成分のみを取得
# 対角成分のみを抽出
diagonal_only = np.tril(np.triu(matrix))
print(diagonal_only)
# [[1 0 0]
# [0 5 0]
# [0 0 9]]
4-2. マスク配列として活用
# 下三角部分のマスクを作成
mask = np.tri(3, dtype=bool)
masked_array = np.where(mask, matrix, 0)
print(masked_array)
# [[1 0 0]
# [4 5 0]
# [7 8 9]]
4-3. 行列の分解
# 行列を上三角と下三角に分解
L = np.tril(matrix, k=-1) # 下三角(対角線なし)
U = np.triu(matrix) # 上三角(対角線あり)
print("L:\n", L)
print("U:\n", U)
print("L + U:\n", L + U)
5. パフォーマンスの考慮事項
大きな配列を扱う際は、インプレース操作を検討しましょう。
# コピーを作成してからインプレース操作
large_matrix = np.random.rand(1000, 1000)
result = large_matrix.copy()
result[np.triu_indices(1000, k=1)] = 0 # 上三角部分を0に
6. よくあるエラーと対処法
非正方行列での注意点
# 非正方行列でも動作するが、結果を理解して使用
rect_matrix = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]])
print(np.tril(rect_matrix))
# [[1 0 0 0]
# [5 6 0 0]]
まとめ
NumPyの三角行列操作関数を適切に使い分けることで、効率的な行列計算が可能になります。
np.tril(): 既存配列から下三角部分を抽出np.triu(): 既存配列から上三角部分を抽出np.tri(): 新しい三角行列を生成
各関数のkパラメータを活用することで、対角線の位置を調整でき、より柔軟な操作が可能です。線形代数計算や数値解析において、これらの関数は必須のツールとなるでしょう。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座


