web-dev-qa-db-fra.com

Comment faire une copie d'un tableau 2D en Python?

X est un tableau 2D. Je veux avoir une nouvelle variable Y celle qui a la même valeur que le tableau X. De plus, toute autre manipulation avec Y ne devrait pas influencer la valeur de X.

Il me semble tellement naturel d'utiliser y = x. Mais cela ne fonctionne pas avec les tableaux. Si je le fais de cette façon et que je change ensuite y, le x sera également modifié. J'ai découvert que le problème peut être résolu comme ça: y = x[:]

Mais cela ne fonctionne pas avec un tableau 2D. Par exemple:

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

résultats [ [1000, 2], [3, 4] ]. Cela n'aide pas non plus si je remplace y=x[:] par y = x[:][:].

Est-ce que quelqu'un sait ce qui est une manière appropriée et simple de le faire?

43
Roman

Essaye ça:

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

Je ne suis pas sûr, peut-être copy() est suffisant.

46
Constantinius

L'utilisation de deepcopy () ou copy () est une bonne solution. Pour un boîtier simple à matrice 2D

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

Pour les tableaux 2D, il est possible d'utiliser la fonction map:

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

Dans votre cas (puisque vous utilisez une liste de listes), vous devez utiliser copie profonde , car 'La différence entre la copie superficielle et la copie profonde n'est pertinente que pour les objets composés (objets qui contiennent d'autres objets, comme des listes ou des instances de classe): une copie superficielle construit un nouvel objet composé puis (dans la mesure du possible) y insère des références aux objets trouvés dans l'original. Une copie profonde construit un nouvel objet composé, puis, récursivement, y insère des copies des objets trouvés dans l'original. '

Notez que l'exemple ci-dessous est simplement destiné à vous montrer un exemple (ne me bat pas trop) comment la copie profonde pourrait être implémentée pour les tableaux 1d et 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
Artsiom Rudzenka

Je pense que np.tile pourrait également être utile

>>> 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