Python
2022.03.25
Pythonの2次元配列の使い方!初期化、追加、検索方法まとめ
2022.03.25

Pythonの2次元配列とはなんでしょうか。この記事では2次元配列とはどのようなものなのか、その他操作方法まで詳しく説明していきます。


1.Pythonの2次元配列とは?

Pythonでいう配列とはリストのことです。つまり「2次元配列」とはリストの要素にリストが入った2次元リストのことを指します。


言葉だけでイメージするのは難しいので、以下のソースコードをご覧ください。

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

two_dimensional_listが2次元配列です。各要素がリストになっているのが確認できるでしょうか。

2.2次元配列の初期化方法


Pythonでは2次元配列の初期化方法がいくつかあります。ここではさまざまな初期化方法を紹介していきます。

①基本的な初期化方法

はじめに、1次元配列で初期化方法を復習しておきましょう。

list1 = [1, 2, 3]
list2 = [4, 5, 6]

print(list1)
# [1, 2, 3]
print(list2)
# [4, 5, 6]

list1 = []
print(list1)
# []
list2 = list()
print(list2)
# []

list1の例では空のリストを代入することでリストを初期化しています。list2の例ではlist関数の引数を指定しないで初期化を行っています。


次に、2次元配列の初期化方法を確認しましょう。

最も基本的な初期化方法は以下の通りです。

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

ご覧のように、リストに新しい形を定義することで初期化しています。[0]*3で[0, 0, 0]を作成し、更にリストを掛け算することで同じリストを複数作成しています。

②リスト内包表記を使う

次に、内包表記を用いた初期化方法を紹介します。


まずはソースコードを見てみましょう。

list2 = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
list2 = [[0 for i in range(3)] for j in range(3)]
print(list2)
# [
#     [0, 0, 0],
#     [0, 0, 0],
#     [0, 0, 0]
# ]

ご覧のように内包表記で初期化を行っています。rangeで回数を指定し、要素を繰り返し入れることによって初期化を行います。


先ほどの例で用いたlist1とlist2は、同じように見えて異なる2次元配列になっているので確認してみましょう。

list1 = [[0]* 3]* 3
list2 = [[0 for i in range(3)] for j in range(3)]

list1[1][1] = 1
list2[1][1] = 1

print(list1)
# [
#     [0, 1, 0],
#     [0, 1, 0],
#     [0, 1, 0]
# ]
print(list2)
# [
#     [0, 0, 0],
#     [0, 1, 0],
#     [0, 0, 0]
# ]

実行結果が異なっていますね。


list1の例では同じリストを複数入れています。そのためひとつのリストの値を変更するだけで、すべてのリストの値が更新されます。それに対し、list2では内包表記で順番に作成された異なるリストが入っているので、実行結果が異なるのです。

③numpyモジュールを使う

最後にnumpyを用いた方法を紹介します。numpyはPythonの拡張モジュールのひとつで、数値計算を高速かつ効率的に行えるようになります。

では実際に使っている例を見ていきましょう。

import numpy as np

list3 = np.zeros((3, 3))
print(list3)
# [[ 0.  0.  0.]
#  [ 0.  0.  0.]
#  [ 0.  0.  0.]]


list3[1][1] = 1
print(list3)
# [
#     [0. 0. 0.],
#     [0. 1. 0.],
#     [0. 0. 0.]
#

1行目でnumpyをインポート(利用可能状態にする)し、asで呼び出す名前を変えています。よって、いちいち「numpy.」とせずに「np.」として呼び出せます。


実際に初期化している箇所を見てみると、list3を直感的に初期化できていることがわかりますね。また、numpyで作成した2次元配列は内包表記で作成したものと同様で、各リストは独立しています。



3.2次元配列の要素にアクセス

ここからは各要素を指定して取り出す方法を紹介していきます。

①基本的なアクセス方法

以下は最初に紹介したソースコードの抜粋になります。

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

ご覧のように、ひとつ目の添字でtwo_dimensional_listの何番目の要素(リスト)か、ふたつ目の添字で指定したリストの何番目の要素を取り出すか指定しています。


こちらを図示すると以下のようになります。

添え字を指定して要素にアクセス

②for文で要素にアクセス

for文を用いたアクセス方法も存在します。

two_dimensional_list = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
for list in two_dimensional_list:
    for element in list:
        print(element)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

ご覧のようにfor文を用いることで要素を順番に指定できます。listにtwo_dimensional_listの要素が順番に格納され、elementにlistの各要素が順番に格納されています。

4.2次元配列の要素の追加

2次元配列も1次元配列(リスト)同様、要素の追加ができます。

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

list1[0].append(100)
print(list1)
# [
#     [1, 2, 3, 100],
#     [4, 5, 6],
#     [7, 8, 9]
# ]

list1のはじめの要素に100が加わりました。このように2次元配列でなく、2次元配列内のリストを指定して要素を加えられます。


また、2次元配列を指定して以下のように追加もできます。

list1.append([10, 11, 12])
print(list1)
# [
#     [1, 2, 3],
#     [4, 5, 6],
#     [7, 8, 9],
#     [10, 11, 12]
# ]

5.2次元配列の要素の検索


ここからは作成した2次元配列のどこに指定の要素があるか検索する方法を紹介します。

①リストを結合してインデックスを検索

2次元配列内の要素を直接指定できないため、はじめに結合し、結合したリストから検索する必要があります。実際のコードを見ていきましょう。

result = []
search_number = 3
two_dimensional_list = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
for list in two_dimensional_list:
    result += list
print(result.index(search_number))
# 2

はじめに結合したリストを入れるための空リストresultを作成し、そちらにfor文で順に要素を結合、最後にindex関数で数値のインデックスを検索しています。


しかしこの方法は手順が多く、何次元の配列かわからない場合は使えません。よって、基本的には以下の方法がおすすめです。

②numpyを用いた検索方法

次に先ほども利用したnumpyを用いた検索方法になります。

実際のソースコードを見ていきましょう。

import numpy as np
list1 = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
print(list1)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

# インデックス1の値が2のリストはどこか検索
print(np.where(list1[:,1]==2)[0])
# [0]

ご覧のようにnumpyのwhereメソッドで検索できます。値のインデックスが分からない場合は、for文などで順番に値を入れて検索しましょう。



6.2次元配列をソート


2次元配列では要素をソートすることが可能です。

import numpy as np

list1 = np.array([
    [5, 6, 4],
    [9, 8, 7],
    [3, 1, 2]
])
print(np.sort(list1))
# [[4 5 6]
#  [7 8 9]
#  [1 2 3]]

print(np.sort(list1, axis=0))# 列のソート
# [[3 1 2]
#  [5 6 4]
#  [9 8 7]]

print(np.sort(list1, axis=1))# 行のソート
# [[4 5 6]
#  [7 8 9]
#  [1 2 3]]

ご覧のようにnumpyを用いると縦方向、横方向のソートを行えます。np.sortの第二引数は省略することが可能です。今回は2つとも指定していましたが、指定しない場合はaxis=1として実行されます。



7.1次元配列を2次元配列に変換


numpyではリストを2次元配列に変換するメソッドがあります。

import numpy as np

list1 = np.array([0, 1, 2, 3, 4, 5])
print(list1)
# [0 1 2 3 4 5]

# 例1
print(list1.reshape(3, 2))
# [[0 1]
#  [2 3]
#  [4 5]]

# 例2
print(list1.reshape(-1, 3))
# [[0 1 2]
#  [3 4 5]]

# 例3
print(list1.reshape(2, -1))
# [[0 1 2]
#  [3 4 5]]

ご覧のように、引数に合わせた形で整形できます。また、例2、3のように引数に「-1」を用いることで自動でサイズを計算してくれます。サイズの異なる変形を指定するとエラーになるので、どちらかの引数は-1にしましょう。



8.2次元配列の転置


最後に2次元配列の転置方法を紹介します。

import numpy as np

list1 = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]

print(np.array(list1).T)
# [[ 1  5  9]
#  [ 2  6 10]
#  [ 3  7 11]
#  [ 4  8 12]]

np.arrayでリストを作成する際に「.T」とつけるだけで転置できます。



9.Pythonを学ぶならトレノキャンプへ


トレノキャンプではPythonを実践的に学ぶためのコースを、オンラインで提供しています。オンデマンド配信なので、いつでも好きなときに受講が可能です。講座の詳しい内容は下記のバナーをクリックしてご覧ください。

この記事をシェア
おすすめの受講コース
  • Python本格入門シリーズ① データ構造とアルゴリズム
  • データ分析完全パック(Python 3 エンジニア認定データ分析試験対応)【データ分析シリーズ 1~3パック】
  • はじめてのデータベース ~仕組みの理解とSQL~
  • Pythonを動かして理解する機械学習 ~回帰と分類~