HOWTO · Python

Python で 3D 配列を宣言する方法

Python で 3D 配列を宣言するために使用できる主なメソッドは、リスト内包表記、乗算メソッド、および numpy パッケージの 3 つです。

このページの内容

Python の 3 次元構造は、ネストしたリストまたは NumPy の ndarray です。独立した Python リストにはネストしたリスト内包表記を、共有参照が許容できる場合にのみリストの乗算を、数値配列演算には NumPy を使用してください。

Python でリスト内包表記を使って 3D リストを宣言する

ネストしたリスト内包表記は通常の Python リストを構築し、各レベルで新しい内側のリストを作成します。以下のリスト内包表記の構文は、形状 2 × 2 × 2 のゼロで埋められた構造を作成します。つまり、外側の要素が 2 つあり、それぞれが 2 つの値を持つ行を 2 行含みます。

この例を実行してください。

n = 2
distance = [[[0 for k in range(n)] for j in range(n)] for i in range(n)]

print(distance)
print((len(distance), len(distance[0]), len(distance[0][0])))

3 つのネストしたループが 3 つの次元に対応します。n を変更するか、各 range に異なるサイズを使用して、立方体ではない形状を構築できます。

Python で乗算メソッドを使って 3D リストを宣言する

* 演算子はリストを繰り返しますが、その中にあるリストを再帰的にコピーすることはしません。以下の式では、繰り返された位置は同じ内側のリストを参照します。したがって、1 つの位置を更新すると、そのリストを共有する他の位置も変更される可能性があります。

n = 2
distance = [[[0] * n] * n] * n
distance[0][0][0] = 7
print(distance)

独立したネストしたリストには、[[[0] * n for _ in range(n)] for _ in range(n)] のように、各レベルで内包表記を使用してください。乗算は、不変の値を繰り返す場合や、共有参照が意図的な場合に適しています。可変のネストしたデータに対しては内包表記と等価ではありません。

Python で NumPy パッケージを使って 3D 配列を宣言する

ndarray とその軸に対する数値演算が必要な場合は NumPy を使用してください。これは外部パッケージです。この例を実行する前に、プロジェクトで使用する Python 環境に pip install numpy でインストールしてください。形状タプルは各軸のサイズを与え、np.zeros は配列をゼロで埋めます。デフォルトの dtype は float です。

try:
    import numpy as np
except ImportError:
    print("NumPy is not installed in this Python environment.")
else:
    new_array = np.zeros((2, 2, 2))
    print(new_array.shape)
    print(new_array.dtype)

NumPy 配列の表示値はネストしたリストとは異なる形式ですが、次元とゼロ初期化はいずれも np.zeros に渡される形状によって決まります。整数のゼロにするには、np.zeros((2, 2, 2), dtype=int) のように dtype=int を渡してください。詳細は NumPy の概要と np.zeros のリファレンスを参照してください。