Par exemple, si nous avons un numpy
tableau A
et que nous voulons un numpy
tableau B
avec les mêmes éléments.
Quelle est la différence entre les méthodes suivantes (voir ci-dessous)? Quand de la mémoire supplémentaire est-elle allouée et quand ne l'est-elle pas?
B = A
B[:] = A
(même queB[:]=A[:]
?)numpy.copy(B, A)
but B = A[:] would do something more like 1
? Selon ce stackoverflow.com/a/2612815new_list = old_list[:]
est également une copie.some_array[:]
cela créera un nouvel objet tableau, mais ce nouvel objet sera une vue de la même mémoire que le tableau d'origine, qui n'aura pas été copié. C'est pourquoi j'ai dit que c'était plus comme çaB = A
. Cela ne prend que de l'O(1)
espace et du temps, plutôt que leO(n)
besoin d'une copie réelle.B=A
crée une référenceB[:]=A
fait une copienumpy.copy(B,A)
fait une copieles deux derniers ont besoin de mémoire supplémentaire.
Pour créer une copie complète, vous devez utiliser
B = copy.deepcopy(A)
la source
B[:] = A
ne fait pas de copie complète des tableaux de type objet, par exempleA = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Maintenant, essayezB[:] = A; B[0][0]=99
, cela changera le premier élément à la fois dans A et B ! À ma connaissance, il n'y a pas d'autre moyen de garantir une copie profonde, même d'un tableau numpy, quecopy.deepcopy
C'est la seule réponse qui fonctionne pour moi:
la source