web-dev-qa-db-ja.com

Pythonで2D配列のコピーを作成する方法は?

Xは2D配列です。配列Yと同じ値を持つ新しい変数Xが必要です。また、Yを使用した操作はXの値に影響を与えません

y = xを使用するのはとても自然なことです。ただし、配列では機能しません。このようにして、yを変更すると、xも変更されます。問題は次のように解決できることがわかりました:y = x[:]

ただし、2D配列では機能しません。例えば:

x = [[1,2],[3,4]]
y = x[:]
y[0][0]= 1000
print x

[ [1000, 2], [3, 4] ]を返します。また、y=x[:]y = x[:][:]に置き換えても役に立ちません。

誰かがそれを行うための適切で簡単な方法を知っていますか?

43
Roman

これを試して:

_from copy import copy, deepcopy
y = deepcopy(x)
_

確かではありませんが、多分 copy() で十分です。

46
Constantinius

Deepcopy()またはcopy()を使用するのが良い解決策です。単純な2D配列の場合

y = [row[:] for row in x]
61
Ryan Ye

2D配列の場合、map関数を使用できます。

old_array = [[2, 3], [4, 5]]
# python2.*
new_array = map(list, old_array)
# python3.*
new_array = list(map(list, old_array))

あなたの場合(リストのリストを使用するため)、 deepcopy を使用する必要があります、なぜなら '浅いコピーと深いコピーの違いは、複合オブジェクト(オブジェクトリストやクラスインスタンスなどの他のオブジェクトを含む):浅いコピーは、新しい複合オブジェクトを構築し、元のオブジェクトで見つかったオブジェクトへの参照を(可能な限り)挿入します。ディープコピーは、新しい複合オブジェクトを構築し、その後、再帰的に、元のオブジェクトで見つかったオブジェクトのコピーを挿入します。 '

以下のサンプルは、deepcopyが1dおよび2d配列にどのように実装できるかの例を示すためのものにすぎないことに注意してください(私に大したことはありません)。

arr = [[1,2],[3,4]]

deepcopy1d2d = lambda lVals: [x if not isinstance(x, list) else x[:] for x in lVals]

dst = deepcopy1d2d(arr)

dst[1][1]=150
print dst
print arr
1

np.tile も役立つと思う

>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2]]])
0
Anoop Toffy