【Python】NumPyで行列(2次元配列)を扱う:生成・アクセス・スライシング

NumPyの ndarray は多次元配列を扱えるため、2次元配列として定義することで数学的な「行列」を表現できます。

提示されたコードにはいくつかのタイプミス(nparraynp.array、カンマがドットになっている等)がありましたので、修正して解説します。 特に行列操作では 「行 (Row)・列 (Column)」 の順番と、スライシングの [行範囲, 列範囲] という記法が重要です。

目次

実行可能なサンプルコード

以下のコードは、3×3の行列を作成し、要素へのアクセスや切り出し(スライス)を行う完全な例です。

import numpy as np

def matrix_operations_demo():
    print("=== 1. 行列の生成 ===")
    # リストのリストを渡して2次元配列を作ります
    # 修正: カンマ区切りにし、np.arrayを使用
    x = np.array([
        [11, 12, 13], 
        [21, 22, 23], 
        [31, 32, 33]
    ])
    print(f"Matrix x:\n{x}")
    print(f"Shape: {x.shape}") # (3, 3) -> 3行3列

    print("\n=== 2. 要素へのアクセス (インデックス) ===")
    # 記法: x[行インデックス, 列インデックス]
    # 0始まりであることに注意してください
    
    # 0行目の2列目 (13)
    val1 = x[0, 2]
    print(f"x[0, 2]: {val1}")
    
    # 2行目の0列目 (31)
    val2 = x[2, 0]
    print(f"x[2, 0]: {val2}")

    print("\n=== 3. スライス (範囲抽出) ===")
    # 記法: x[開始行:終了行, 開始列:終了列]
    # 終了インデックスは「含まれない」ルールです
    
    # 0行目〜1行目(2の手前)、かつ 0列目〜1列目(2の手前) を抽出
    # つまり左上の2x2行列を取り出します
    sub_matrix = x[0:2, 0:2]
    print(f"x[0:2, 0:2] (左上2x2):\n{sub_matrix}")

    print("\n=== 4. 行の抽出 ===")
    # インデックスを1つだけ指定すると「行」が取得されます
    
    # 0行目すべて
    row_0 = x[0]
    print(f"x[0] (1行目): {row_0}")

    print("\n=== 5. 列の抽出 ===")
    # 「:」は「すべて」を意味します
    # 記法: x[:, 列インデックス] -> 「全行の、指定した列」という意味
    
    # 1列目 (真ん中の縦列: 12, 22, 32)
    col_1 = x[:, 1]
    print(f"x[:, 1] (2列目): {col_1}")

if __name__ == "__main__":
    matrix_operations_demo()

解説:インデックス操作のルール

1. 座標の指定 x[row, col]

Excelなどの表計算ソフトとは異なり、プログラミングでは 0から数え始めます

  • x[0, 0]: 左上(最初の要素)
  • x[1, 2]: 2行目の3列目

2. スライシング x[start:end]

  • 0:2 と書いた場合、インデックス 01 が対象になります(2は含まれません)。
  • : だけ書くと「その次元のすべて」という意味になります。

3. 列を取り出すテクニック x[:, i]

特定の「列」だけを取り出したい場合、行の指定部分に :(全行)を指定するのがポイントです。 これはデータ分析で「特定の項目のデータだけを抜き出す」際によく使われます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次