【python】多次元配列の作り方・参照方法

2020年5月17日

Listを使用して1次元配列を作成することができますが、さらに次元を上げることも可能です。
2次元配列や3次元配列も作成することが可能で、さらに上の次元の配列を作成することも可能です。
2以上の次元を持った配列を多次元配列やN次元配列とも呼びます。

多次元配列のイメージ

プログラムを知らない人の次元の考え方は空間(3次元空間、2次元空間)に対してのイメージが強いかなと思います。プログラムでもこのイメージとさほど変わりません。

次元数空間イメージプログラム上の参照方法
1線(X)List[X]
2縦(X)×横(Y) List[X][Y]
3縦(X)×横(Y)×高さ(Z) List[X][Y][Z]
4縦(X)×横(Y)×高さ(Z)×時間(T)List[X][Y][Z][T]
5縦(X)×横(Y)×高さ(Z)×時間(T)×要素1(N1)List[X][Y][Z][T][N1]
6以上縦(X)×横(Y)×高さ(Z)×時間(T)×要素1(N1)×・・・×要素n(Nn) List[X][Y][Z][T][N1]・・・[Nn]

人間が現実空間で自由に干渉できる次元数が3に対して、プログラム上で操作できる次元数に上限はありません(メモリの限界を除く)。
多次元配列を参照・更新する場合でも次元数に合わせて角括弧の組み合わせを次元数分増やせばよいのでお手軽です。
一般的概念でいえば5次元空間以上のイメージは人間にできないといわれていますが、プログラム的考えで言えば 5次元以上も容易です。

多次元配列を学習した時には世界の真理が垣間見えた気がして厨二心がくすぐられた記憶があります。

2次元配列の宣言と参照

二次元配列を宣言してみましょう。
これは3×3の配列なります。
要素が3つを束ねた1次元配列を3つ束ねた状態になります。

    list2D = [ [ 1 , 2 , 3 ],
               [ 4 , 5 , 6 ],
               [ 7 , 8 , 9 ] ]
    
    print(list2D)        #[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

2次元配列に対して要素を1つしか与えずに参照すると、1次元配列が参照できます。

    print(list2D[0])     #[1, 2, 3]
    print(list2D[1])     #[4, 5, 6]
    print(list2D[2])     #[7, 8, 9]

2次元配列に対して要素を2つ与えた場合は変数が参照できます。

    print(list2D[0][0])  #1
    print(list2D[0][1])  #2
    print(list2D[0][2])  #3
    print(list2D[1][0])  #4
    print(list2D[1][1])  #5
    print(list2D[1][2])  #6
    print(list2D[2][0])  #7
    print(list2D[2][1])  #8
    print(list2D[2][2])  #9

2次元配列を多重forループで取り出す

1次元配列はforループを使用して変数を取り出すことができます。
2次元配列も同じことができますが、方法として2重forループを使用する必要があります。
forループの中で forループを行うことを言います。
処理の中に処理を入れる場合、「入れ子」や「ネスト」ということもあります

    list2D = [ [ 1 , 2 , 3 ],
               [ 4 , 5 , 6 ],
               [ 7 , 8 , 9 ] ]
    
    for list1D in list2D:   #2次元配列から1次元配列を取り出す
        print(list1D)       #1次元配列を表示
        for num in list1D:  #1次元配列から変数を取り出す
            print(num)      #変数を表示

実行結果

[1, 2, 3]
1
2
3
[4, 5, 6]
4
5
6
[7, 8, 9]
7
8
9

3次元配列の宣言と参照

3次元配列を宣言してみましょう
3×3×3の配列になります。
3×3の2次元配列を3つ束ねて3次元配列としています。

3×3×3なのでルービックキューブ上の形をしています。それそれのブロックに変数がな代入されているイメージです。

    list3D = [ [ [ 1 , 2 , 3 ],
                 [ 4 , 5 , 6 ],
                 [ 7 , 8 , 9 ] ],
               [ [ "a" , "b" , "c" ],
                 [ "d" , "e" , "f" ],
                 [ "g" , "h" , "i" ] ],
               [ [ 1.5  , 3.5  , 5.5  ],
                 [ 7.5  , 9.5  , 11.5  ],
                 [ 12.5 , 14.5 , 16.5 ] ] ]
    print(list3D)   #[[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], [[1.5, 3.5, 5.5], [7.5, 9.5, 11.5], [12.5, 14.5, 16.5]]]
    

要素を1つ与えると次元は1つ減り、2次元配列を参照できます。

    print(list3D[0])  #[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print(list3D[1])  #[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
    print(list3D[2])  #[[1.5, 3.5, 5.5], [7.5, 9.5, 11.5], [12.5, 14.5, 16.5]]

要素を2つ与えるとj次元が2つ減り、1次元配列を参照できます。

    print(list3D[0][0])  #[1, 2, 3]
    print(list3D[1][1])  #['d', 'e', 'f']
    print(list3D[2][2])  #[12.5, 14.5, 16.5]

要素を3つ与えると次元が無くなり変数を参照できます。

    print( list3D[0][0][0] )  #1
    print( list3D[1][1][1] )  #e
    print( list3D[2][2][2] )  #16.5

3次元配列を多重forループで取り出す

for文を3回ネスト(入れ子)すると総当たりで変数を取り出すことができます。

    list3D = [ [ [ 1 , 2 , 3 ],
                 [ 4 , 5 , 6 ],
                 [ 7 , 8 , 9 ] ],
               [ [ "a" , "b" , "c" ],
                 [ "d" , "e" , "f" ],
                 [ "g" , "h" , "i" ] ],
               [ [ False , True  , True  ],
                 [ True  , False , True  ],
                 [ True  , True  , False ] ] ]

    for list2D in list3D:       #3次元配列から2次元配列を取り出す
        for list1D in list2D:   #2次元配列から1次元配列を取り出す
            for num in list1D:  #1次元配列から変数を取り出す
                print(num)

実行結果

1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
g
h
i
1.5
3.5
5.5
7.5
9.5
11.5
12.5
14.5
16.5

不規則な多次元配列

pythonでは不規則な形をした多次元配列も作成できます。
奇妙な形をしていますが10次元配列です 。

    listND = [ [ [ [ [ [ [ [ [ [ 1 ] , 2 ] , 3 ] , 4 ] , 5 ] , 6 ] , 7 ] , 8 ] , 9 ] , 10 ] 

参照する時は要素を10個用意して参照します。

print( listND[0][0][0][0][0][0][0][0][0][0] )  #1

for文で10回ループして10次元配列を取り出してみましょう


    print( listND )
    for num in range(10):
        listND = listND[0]  #次元を一つ落とす代入式
        print(listND)

実行結果

[[[[[[[[[[1], 2], 3], 4], 5], 6], 7], 8], 9], 10]
[[[[[[[[[1], 2], 3], 4], 5], 6], 7], 8], 9]
[[[[[[[[1], 2], 3], 4], 5], 6], 7], 8]
[[[[[[[1], 2], 3], 4], 5], 6], 7]
[[[[[[1], 2], 3], 4], 5], 6]
[[[[[1], 2], 3], 4], 5]
[[[[1], 2], 3], 4]
[[[1], 2], 3]
[[1], 2]
[1]
1

ソースコードはこちらから

このページで紹介している記事のソースコードの販売を行っています。
python基本を押さえたソースコードを収録しています。
購入頂いたソースコードは商用利用OKになります。

ソースコードの販売はこちら