NumPy配列で三角行列を自在に操作!tril・triu・triの使い方完全ガイド

 

NumPyで行列計算を行う際、下三角行列や上三角行列を扱うことは非常に多くあります。本記事では、NumPyのtriltriutri関数を使った三角行列の抽出・生成方法を、豊富なサンプルコードとともに詳しく解説します。

三角行列とは?

三角行列は、対角線を境界として一方の要素がすべて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爆速講座