Respuestas:
Las tres versiones hacen cosas diferentes:
B = A
Esto une un nuevo nombre B
al objeto existente ya nombrado A
. Luego se refieren al mismo objeto, por lo que si modifica uno en su lugar, verá el cambio a través del otro también.
B[:] = A
(igual que B[:]=A[:]
?)
Esto copia los valores de A
una matriz existente B
. Las dos matrices deben tener la misma forma para que esto funcione. B[:] = A[:]
hace lo mismo (pero B = A[:]
haría algo más como 1).
numpy.copy(B, A)
Esta no es una sintaxis legal. Probablemente quisiste decir B = numpy.copy(A)
. Es casi lo mismo que 2, pero crea una nueva matriz, en lugar de reutilizar la B
matriz. Si no hubiera otras referencias al B
valor anterior , el resultado final sería el mismo que 2, pero usará más memoria temporalmente durante la copia.
¿O quizás quisiste decir numpy.copyto(B, A)
, que es legal y es equivalente a 2?
but B = A[:] would do something more like 1
? Según esto, stackoverflow.com/a/2612815 new_list = old_list[:]
también es una copia.
some_array[:]
creará un nuevo objeto de matriz, pero ese nuevo objeto será una vista de la misma memoria que la matriz original, que no se habrá copiado. Por eso dije que es más parecido B = A
. Solo toma O(1)
espacio y tiempo, en lugar de la cantidad O(n)
de cada uno que necesitaría una copia real.
B=A
crea una referenciaB[:]=A
hace una copianumpy.copy(B,A)
hace una copialos dos últimos necesitan memoria adicional.
Para hacer una copia profunda necesitas usar B = copy.deepcopy(A)
B[:] = A
qué no hacer una copia profunda de matrices de tipo de objeto, por ejemplo A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Ahora inténtelo B[:] = A; B[0][0]=99
, ¡esto cambiará el primer elemento tanto en A como en B ! Que yo sepa, no hay otra forma de garantizar una copia profunda, incluso de una matriz numérica, quecopy.deepcopy