Как сделать копию двумерного массива в Python?

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[:][:].

Кто-нибудь знает, что это правильный и простой способ сделать это?

Ответ 1

Попробуйте следующее:

from copy import copy, deepcopy
y = deepcopy(x)

Я не уверен, возможно copy().

Ответ 2

Использование метода deepcopy() или copy() является хорошим решением. Для простого случая 2D-массива

y = [row[:] for row in x]

Ответ 3

Для 2D-массивов возможно использование функции map:

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

Ответ 4

В вашем случае (поскольку вы используете список списков), вы должны использовать 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

Ответ 5

Я думаю, 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]]])