Respostas:
Todas as três versões fazem coisas diferentes:
B = A
Isso associa um novo nome B
ao objeto existente já nomeado A
. Posteriormente, eles se referem ao mesmo objeto, portanto, se você modificar um no local, verá a mudança através do outro também.
B[:] = A
(igual a B[:]=A[:]
?)
Isso copia os valores A
em uma matriz existente B
. As duas matrizes devem ter o mesmo formato para que isso funcione. B[:] = A[:]
faz a mesma coisa (mas B = A[:]
faria algo mais parecido com 1).
numpy.copy(B, A)
Esta não é uma sintaxe legal. Você provavelmente quis dizer B = numpy.copy(A)
. Isso é quase o mesmo que 2, mas cria uma nova matriz, em vez de reutilizar a B
matriz. Se não houvesse outras referências ao B
valor anterior , o resultado final seria igual a 2, mas usará mais memória temporariamente durante a cópia.
Ou talvez você quisesse dizer numpy.copyto(B, A)
, que é legal e é equivalente a 2?
but B = A[:] would do something more like 1
? De acordo com este stackoverflow.com/a/2612815 new_list = old_list[:]
também é uma cópia.
some_array[:]
criará um novo objeto de array, mas esse novo objeto será uma visualização da mesma memória do array original, que não terá sido copiado. É por isso que eu disse que é mais parecido B = A
. Leva apenas O(1)
espaço e tempo, ao invés O(n)
de cada um que uma cópia real precisaria.
B=A
cria uma referênciaB[:]=A
faz uma cópianumpy.copy(B,A)
faz uma cópiaos dois últimos precisam de memória adicional.
Para fazer uma cópia profunda, você precisa usar B = copy.deepcopy(A)
B[:] = A
se não fazer uma cópia profunda de matrizes de objeto do tipo, por exemplo A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Agora tente B[:] = A; B[0][0]=99
, isso mudará o primeiro elemento em A e B ! Que eu saiba, não há outra maneira de garantir uma cópia profunda, mesmo de um numpy-array, do quecopy.deepcopy