この投稿は、NumPyの3次元配列について学習した内容を整理した記録です。2次元配列までは理解できても、3次元になると少しイメージしづらかったので、具体例を使ってまとめました。
配列の次元と[]
のネストの関係
NumPyの配列は、[]
の入れ子(ネスト)構造の深さ=次元数になります。
例:1次元配列([]が1段)
np.array([1, 2, 3])
# → shape: (3,) → 1次元配列(ベクトル)
例:2次元配列([]が2段)
np.array([[1, 2], [3, 4]])
# → shape: (2, 2) → 2次元配列(行列)
例:3次元配列([]が3段)
np.array([
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
])
# → shape: (2, 2, 2) → 3次元配列(階層構造)
ポイント:リストのネストが1段深くなるごとに次元が1つ増える
3次元配列とは?
NumPyの3次元配列は、**「階層・行・列」**の3つの軸を持つ配列です。
2次元配列が「表(マトリクス)」なら、3次元配列は「その表を何枚も重ねた立体構造」のようなものです。
イメージ:Excelの「シートが何枚もあるブック」
配列の作成(3次元)
3次元配列は、リストのリストのリストを np.array()
に渡すことで作成できます。
import numpy as np
a = np.array([
[[1, 2], [3, 4]],
[[5, 6], [7, 8]]
])
print(a)
このときの配列 a
の構造は以下のようなイメージです:
- 2階層(軸0)
- 各階層に 2行(軸1) × 2列(軸2) の行列がある
[
[ [1, 2], [3, 4] ],
[ [5, 6], [7, 8] ]
]
shapeで構造を確認する
print(a.shape) # (2, 2, 2)
これは「2階層 × 2行 × 2列」の3次元構造であることを意味します。
ndimで次元数を確認する
print(a.ndim) # 3
要素を取り出す(インデックス指定)
3次元配列では、3つのインデックスを使って要素を指定します。
print(a[0, 0, 1]) # 出力: 2(1階層目・1行目・2列目)
print(a[1, 1, 0]) # 出力: 7(2階層目・2行目・1列目)
スライスで取り出す
特定の軸方向で複数の要素をまとめて取得できます。
# 全階層から、1行目・すべての列を取得
print(a[:, 0, :])
# 出力:
# [[1 2]
# [5 6]]
# 2階層目のすべての行・すべての列を取得
print(a[1, :, :])
# 出力:
# [[5 6]
# [7 8]]
# 全階層・全行から、1列目だけを取り出す
print(a[:, :, 0])
# 出力:
# [[1 3]
# [5 7]]
要素の再代入
値を変更することもできます。
a[0, 1, 1] = 99
print(a)
変更された位置:1階層目・2行目・2列目(元の値は4)
まとめ
操作 | 例 | 結果 |
---|---|---|
配列の作成 | np.array([[[...]]]) |
3次元配列を作成できる |
次元の確認 | a.ndim |
3 |
形状の確認 | a.shape |
例えば (2, 3, 4) |
要素の取得 | a[階層, 行, 列] |
単一の値 |
スライス取得 |
a[:, :, 0] など |
配列の一部を取得 |
再代入 | a[1, 0, 1] = 新しい値 |
値を更新できる |
NumPyの配列は、[]
のネストが深くなるにつれて次元が増えていきます。3次元配列では、**「階層 → 行 → 列」**の順でインデックスを指定します。最初は混乱しやすいですが、shapeやスライスを使って少しずつ慣れていこうと思います。