読者です 読者をやめる 読者になる 読者になる

sonickun.log

備忘録

Pythonで2次元配列の静的確保と動的確保

プログラミング

 Pythonでデータ分析をするときにどうしても2次元配列を使いたかったのですが、Numpyを使った配列定義がわかりにくくて困っていたところ、友人にNumpyを使わない方法を教えてもらったので載せておきます。個人的にはこの方法が一番シンプルで好きです。
 またこの方法なら、2次元以上の多次元配列も定義できます。

2次元配列の静的確保

・悪い例

 次のように配列を定義すると、要素を更新すると中身が変になります。

>>> arr = [[0]*3]*5
>>> arr
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>>
>>>
>>> arr[1][2] = 1
>>> arr
[[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]]

 このように、1つの要素を書き換えたはずなのに、他の要素まで書き換わってしまいます。

・良い例

 for文を使ったリスト内包表記で次のように配列を作ります。

>>> arr = [[0 for i in range(3)] for j in range(5)]
>>> arr
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>>
>>>
>>> arr[1][2] = 1
>>> arr
[[0, 0, 0], [0, 0, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

こうすると、正しく要素を指定できます。

2次元配列の動的確保

 配列の動的確保にはappend関数を使います。append関数は引数に指定した要素を配列に追加してくれる関数です。

>>> arr = [[]]
>>> arr
[[]]
>>>
>>> arr.append(0)
>>> arr
[[], 0]
>>>
>>> arr.append([1,2,3])
>>> arr
[[], 0, [1, 2, 3]]
>>>
>>> arr[0].append(5)
>>> arr
[[5], 0, [1, 2, 3]]

 このように、自在に配列を生成することができます。