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?
@Mr_and_Mrs_D: Matrizes Numpy funcionam de maneira diferente das listas. Cortar um array não faz uma cópia, apenas cria uma nova visualização dos dados do array existente.
Blckknght
O que significa but B = A[:] would do something more like 1? De acordo com este stackoverflow.com/a/2612815new_list = old_list[:] também é uma cópia.
mrgloom
4
@mrgloom: As matrizes Numpy funcionam de maneira diferente das listas quando se trata de fatiar e copiar seu conteúdo. Uma matriz é uma "visualização" de um bloco de memória subjacente onde os valores numéricos são armazenados. Fazer um slice como 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.
Blckknght
27
B=A cria uma referência
B[:]=A faz uma cópia
numpy.copy(B,A) faz uma cópia
os dois últimos precisam de memória adicional.
Para fazer uma cópia profunda, você precisa usar B = copy.deepcopy(A)
Referindo-se ao seu segundo exemplo: 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
but B = A[:] would do something more like 1
? De acordo com este stackoverflow.com/a/2612815new_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 parecidoB = A
. Leva apenasO(1)
espaço e tempo, ao invésO(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)
fonte
B[:] = A
se não fazer uma cópia profunda de matrizes de objeto do tipo, por exemploA = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Agora tenteB[:] = 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
Esta é a única resposta que funciona para mim:
fonte