初心者が7日でマスターするPython二次元配列のすべて!

初心者が7日でマスターするPython二次元配列のすべてPython
この記事は約11分で読めます。

※Japanシーモアは、利用目的を問わず掲載されているコードの再利用が可能です。常に解説内容のわかりやすさや記事の品質に注力しておりますので、不具合・分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。(理解できない部分などの個別相談も無償で承っております)
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonを学ぶ皆さん、こんにちは。

今回の記事では、初心者でも7日間でマスターできる「Pythonの二次元配列」について、その作り方から使い方、そして応用例までを丁寧に解説していきます。

一緒にPython二次元配列のすべてを学びましょう!

●Python二次元配列とは

Pythonの二次元配列とは、その名の通り、二次元(行と列)の形状を持つ配列のことを指します。

一次元配列が直線上のデータを表現するのに対し、二次元配列は平面(表形式)のデータを表現するために用いられます。

例えば、エクセルのようなスプレッドシートやチェス盤などは二次元配列として表現することができます。

○二次元配列の基本

二次元配列は、一次元配列が格納された一次元配列として作成します。

つまり、それぞれの一次元配列が行を形成し、それらが組み合わさって全体としての二次元配列を形成します。

一次元配列の要素にアクセスするためにはインデックスを指定しますが、二次元配列では行と列のインデックスを指定して要素にアクセスします。

●二次元配列の作り方

それでは、Pythonで二次元配列をどのように作るのか見てみましょう。

○サンプルコード1:二次元配列の初期化

下記のコードは、Pythonで二次元配列を初期化する基本的な例です。

このコードでは、0で初期化された3行3列の二次元配列を作成しています。

array_2d = [[0 for _ in range(3)] for _ in range(3)]
print(array_2d)

このコードを実行すると、次のように0で初期化された3行3列の二次元配列が出力されます。

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

ここでは、内包表記を使用して配列を生成しています。for _ in range(3)とすることで、3つの要素を持つ一次元配列を作成し、それを更に3回繰り返して二次元配列を作成しています。

○サンプルコード2:二次元配列への値の代入

二次元配列への値の代入も、一次元配列の場合と同様に行うことができます。

下記のコードでは、先ほど初期化した二次元配列の1行目2列目(インデックスは0から始まるので、実際の指定は[0][1]となります)に値を代入しています。

array_2d[0][1] = 10
print(array_2d)

このコードを実行すると、次のように値が代入された二次元配列が出力されます。

[[0, 10, 0], [0, 0, 0], [0, 0, 0]]

このように、二次元配列の特定の位置に値を代入するためには、array_2d[行のインデックス][列のインデックス]の形式で指定します。

●二次元配列の使い方

作成した二次元配列を効果的に活用するためには、基本的な使い方を理解しておく必要があります。

それでは、二次元配列から値を取得する方法や、二次元配列の行・列の長さを取得する方法、二次元配列をループ処理する方法を紹介します。

○サンプルコード3:二次元配列から値を取得

二次元配列から値を取得するには、一次元配列と同じようにインデックスを使用します。

下記のコードでは、二次元配列の2行目3列目の値を取得しています。

value = array_2d[1][2]
print(value)

このコードを実行すると、次のように指定した位置の値が出力されます(初期化した直後の配列なので、出力される値は0です)。

0

ここでも、インデックスは0から始まるため、2行目3列目を指定する場合はarray_2d[1][2]とします。

○サンプルコード4:二次元配列の行・列の長さを取得

二次元配列の行の長さ(行数)と列の長さ(列数)を取得するには、組み込み関数のlen()を使用します。

下記のコードでは、二次元配列の行の長さと列の長さを取得しています。

num_rows = len(array_2d)
num_cols = len(array_2d[0])
print(f"行数:{num_rows}、列数:{num_cols}")

このコードを実行すると、次のように行数と列数が出力されます。

行数:3、列数:3

ここでは、len(array_2d)で行数を、len(array_2d[0])で列数を取得しています。

○サンプルコード5:二次元配列をループ処理

二次元配列の全ての要素にアクセスするためには、ループ処理を利用します。

Pythonではfor文を二重に用いることで、簡単に二次元配列のループ処理が可能です。

このコードでは、Pythonの二次元配列をループ処理して、各要素を出力するコードを紹介しています。

この例では、二次元配列の要素を一つ一つ取り出し、表示しています。

# 二次元配列を定義
array_2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 二次元配列の全要素をループ処理
for row in array_2d:
    for element in row:
        print(element)

上記のコードを実行すると、二次元配列の全要素が一行ずつ出力されます。

1
2
3
4
5
6
7
8
9

ここでのループ処理は、二次元配列の外側のリスト(ここでは’array_2d’)から一つずつ内側のリスト(ここでは’row’)を取り出し、その後内側のリストから一つずつ要素を取り出している、と理解すると良いでしょう。

●二次元配列の応用例

Pythonの二次元配列は、行列の計算にも利用されます。例えば、行列の加算や乗算などがこれに該当します。

次に、これらの操作を行うサンプルコードを見てみましょう。

○サンプルコード6:行列の加算

このコードでは、Pythonを使って二つの二次元配列(行列)の加算を行うコードを紹介しています。

この例では、同じ形状の二つの二次元配列を用意し、その要素同士を加算しています。

# 二つの二次元配列を定義
array_2d_1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
array_2d_2 = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]

# 新しい二次元配列を作成(加算結果を保存)
array_2d_sum = []

# 二次元配列の加算
for i in range(len(array_2d_1)):
    row = []  # 一時的に加算結果を保存するリスト
    for j in range(len(array_2d_1[0])):
        row.append(array_2d_1[i][j] + array_2d_2[i][j])
    array_2d_sum.append(row)

print(array_2d_sum)

このコードを実行すると、二つの二次元配列の要素同士が加算された結果が得られます。

[[11, 22, 33], [44, 55, 66], [77, 88, 99]]

ここでは、空のリスト ‘array_2d_sum’ を用意し、その中に加算結果を一行ずつ追加しています。

それぞれの行の加算結果は一時的に ‘row’ というリストに保存し、全ての加算が終わったら ‘array_2d_sum’ に追加します。

○サンプルコード7:行列の乗算

このコードでは、Pythonを使って二つの二次元配列(行列)の乗算(内積)を行うコードを紹介しています。

この例では、同じ形状の二つの二次元配列を用意し、その行列の内積を計算しています。

# 二つの二次元配列を定義
array_2d_1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
array_2d_2 = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]

# 新しい二次元配列を作成(乗算結果を保存)
array_2d_mul = []

# 二次元配列の乗算
for i in range(len(array_2d_1)):
    row = []  # 一時的に乗算結果を保存するリスト
    for j in range(len(array_2d_1[0])):
        sum = 0  # 一時的に内積の結果を保存する変数
        for k in range(len(array_2d_1)):
            sum += array_2d_1[i][k] * array_2d_2[k][j]
        row.append(sum)
    array_2d_mul.append(row)

print(array_2d_mul)

このコードを実行すると、二つの二次元配列の行列の乗算結果が得られます。

[[300, 360, 420], [660, 810, 960], [1020, 1260, 1500]]

ここでは、空のリスト ‘array_2d_mul’ を用意し、その中に乗算結果を一行ずつ追加しています。

それぞれの行の乗算結果は一時的に ‘row’ というリストに保存し、全ての乗算が終わったら ‘array_2d_mul’ に追加します。

行列の乗算では、一つ目の行列の行と二つ目の行列の列の要素を掛け合わせた値を全て加えることで一つの要素が求まります。

これを全ての行と列に対して行うことで、乗算の結果が得られます。

●二次元配列の注意点と対処法

Pythonの二次元配列を扱う際の一つの注意点は、二次元配列を作成する際に同じリストを複数回参照することです。

これは、意図せず配列の要素が同期してしまう原因となります。対処法としては、各行のリストを明示的に新しく作成することで避けられます。

このことを説明するためのサンプルコードを見てみましょう。

○サンプルコード8:二次元配列の注意点と対処法

このコードでは、Pythonの二次元配列の注意点とその対処法について紹介しています。

この例では、リストを複製する際の注意点とその対処法を説明しています。

# 間違った二次元配列の作成方法
wrong_array = [[0]*3]*3
print(wrong_array)  # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
wrong_array[0][0] = 1
print(wrong_array)  # [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

# 正しい二次元配列の作成方法
correct_array = [[0]*3 for _ in range(3)]
print(correct_array)  # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
correct_array[0][0] = 1
print(correct_array)  # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]

上記のコードの’wrong_array’の部分では、'[[0]3]3’という表現で二次元配列を作成していますが、この場合、全ての行が同じオブジェクト(ここでは'[0, 0, 0]’のリスト)を参照しています。

そのため、一つの要素の値を変更すると、他の行の同じ位置の要素の値も変更されてしまいます。

一方、’correct_array’では、'[[0]*3 for _ in range(3)]’という表現で二次元配列を作成しています。

ここでは、’for _ in range(3)’の部分で新しいリストを作成して各行に追加しているため、各行は独立したオブジェクトを参照しています。

その結果、一つの要素の値を変更しても、他の行の同じ位置の要素の値は変更されません。

このように、Pythonの二次元配列を作成する際は、各行が新しいリストを参照するように注意が必要です。

●二次元配列のカスタマイズ方法

Pythonの二次元配列は、自由にカスタマイズすることが可能です。

例えば、二次元配列の形状を変える、特定のパターンの二次元配列を作成するなど、様々なカスタマイズが可能です。

○サンプルコード9:二次元配列のカスタマイズ例

このコードでは、Pythonで特定のパターンの二次元配列を作成するカスタマイズ例を紹介しています。

この例では、対角要素だけ1で、それ以外の要素が0の二次元配列(単位行列)を作成しています。

# 単位行列を作成するコード
identity_matrix = [[1 if i == j else 0 for j in range(3)] for i in range(3)]
print(identity_matrix)  # [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

上記のコードでは、内包表記を使って一行ずつ要素を作成しています。

‘if i == j else 0’の部分で、行のインデックス’i’と列のインデックス’j’が等しいときだけ1を、それ以外の場合は0を要素としています。

これにより、対角要素だけが1で、それ以外の要素が0の二次元配列が作成されます。

まとめ

以上がPythonの二次元配列の基本的な使い方と注意点についての説明です。

二次元配列は表形式のデータを扱う際に非常に便利なツールです。

初心者の方も上記の内容を理解し、Pythonの二次元配列を活用してみてください。

また、本記事で紹介したコードやテクニックを応用して、自由に二次元配列をカスタマイズし、自分だけのプログラムを作成することも可能です。

まずは7日間、少しずつ挑戦してみてください。

プログラミングスキルは日々の積み重ねから身につきます。

明日からのあなたのプログラミングライフが、今日よりも一歩前進しますように。