Respostas:
Todas as três versões fazem coisas diferentes:
B = A
Isso associa um novo nome Bao 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 Aem 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 Bmatriz. Se não houvesse outras referências ao Bvalor 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[:] = Ase 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