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

cette question a déjà une réponse ici:

  • copier des listes imbriquées en Python 2 réponses
  • comment cloner ou copier une liste? 18 réponses

X est un tableau 2D. Je veux avoir une nouvelle variable Y 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 si naturel d'utiliser y = x . Mais ça ne marche pas avec les tableaux. Si je le fais de cette façon et les modifications y, x sera changé aussi. J'ai découvert que le problème peut être résolu comme cela: y = x[:]

mais il ne fonctionne pas avec le tableau 2D. Par exemple:

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

renvoie [ [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 qu'est une façon correcte et simple de le faire?

37
demandé sur Roman 2011-06-30 13:43:40

5 réponses

essayez ceci:

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

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

38
répondu Constantinius 2011-06-30 09:46:36

en utilisant deepcopy() ou copy() est une bonne solution. Pour un cas simple de 2D-array

y = [row[:] for row in x]
56
répondu Ryan Ye 2011-06-30 09:59:33

pour les tableaux 2D il est possible d'utiliser carte fonction:

old_array = [[2, 3], [4, 5]]
# python2.*
new_array = map(list, old_array)
# python3.*
new_array = list(map(list, old_array))
9
répondu Анатолий Панин 2017-12-19 18:23:02

dans votre cas (puisque vous utilisez la liste des listes) vous devez utiliser deepcopy , parce que ' 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é et y insère (dans la mesure du possible) des références aux objets trouvés dans l'original. Une copie profonde construit un nouvel objet composé et puis, de manière récursive, insère des copies d'objets trouvés dans l'original."

notez que l'échantillon ci-dessous est simplement destiné à vous montrer un exemple(ne me battez pas trop) comment deepcopy pourrait être mis en œuvre 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
répondu Artsiom Rudzenka 2011-06-30 10:05:37

je pense np.tuile aussi pourrait ê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
répondu Anoop Toffy 2015-08-01 08:27:02