Python(2次元配列のコピー)

■配列コピーの方法の復習。
強化学習のQtableを作成する場合、状態 × Action のリストを作る。例えば、状態が4つあり、Actionが3つある場合は、下のような感じになる。ここで、a1は状態aのときにAction1をとるかについて参照する値(大きな値のものが選択される)のイメージ。

前回見た迷路では、外周を含めて13×13マスあるので、外周を除くと11×11の121の状態がある。そこに対して、上、下、右、左の4つのActionが取れるので、121×4のQtableとなる。
迷路の位置情報は縦、横の2次元なので、121の状態の1次元に変換して使うこともできるけど、そのまま位置情報を入れてQtableを2次元配列として使うこともできるはず。

2次元配列のコピーについて復習。
サンプルコードは下のもの。

import copy

list = []
list.append(1)
list.append(2)
list.append(3)

print(list)

#=====1次元=====
list2 = list
print(list2)
list[0] = 4
print(list)
print(list2)

list3 = list[:]
list[0] = 5
print(list)
print(list3)

list4 = copy.copy(list)
list[0] = 6
print(list)
print(list4)

print("=1=============================")
#=====2次元=====
list_arr = []

list_arr.append([1,1])
list_arr.append([1,2])
list_arr.append([2,1])
list_arr.append([2,2])
print(list_arr)

list_arr2 = list_arr[:]
print(list_arr2)
list_arr[1][0] = 3
print(list_arr)
print(list_arr2)
list_arr[0] = [9,9]
print(list_arr)
print(list_arr2)

print("=arr3=============================")
list_arr3 = copy.copy(list_arr)
print(list_arr)
print(list_arr3)

list_arr[1][0] = 4
print(list_arr)
print(list_arr3)

print("=arr4=============================")
list_arr4 = copy.deepcopy(list_arr)
list_arr[1][0] = 5
print(list_arr)
print(list_arr4)

結果が次。


1次元配列では、「=」でコピーを作ると参照渡しとなって、もとの配列の値を変えるとコピー先も変わる。list[:] のようにスライスを使うと、配列内の要素のすべてをコピーして値自体が渡されるよう。
一方、2次元配列では、[:]を使っても1次元分しか値渡しではコピーされていない。こちらをコピーするためには、copyライブラリのdeepcopyを使うと、コピー先へ値自体を移すことができた。