English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Cópia e Visualização de Array do NumPy

A cópia é uma cópia completa dos dados, se alterarmos a cópia, ela não afetará os dados originais, e a memória física não está no mesmo local.
A vista é um sinônimo ou referência dos dados, através do qual também é possível acessar e operar os dados originais, mas os dados originais não geram uma cópia. Se alterarmos a vista, ela afetará os dados originais, no mesmo local da memória física.

Diferença entre cópia e vista

A principal diferença entre a cópia e a vista do array é que a cópia é um novo array, enquanto a vista é apenas a vista do array original.A cópia possui dados, qualquer alteração feita na cópia não afetará o array original, e qualquer alteração feita no array original também não afetará a cópia.A vista não possui dados, qualquer alteração feita na vista afetará o array original, e qualquer alteração feita no array original também afetará a vista.

A vista geralmente ocorre:

1、a operação de fatiamento do numpy retorna a vista dos dados originais.2、gera uma vista chamando a função view() do ndarray.

A cópia geralmente ocorre:

Operação de fatiamento de sequência Python, chamada da função deepCopy().A chamada da função copy() do ndarray gera uma cópia.

无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

Nenhum cópia
A simples atribuição não criará uma cópia do objeto de array. Em vez disso, usará o mesmo id() do array original para acessá-lo. O id() retorna o identificador geral do objeto Python, semelhante ao ponteiro em C. Além disso, qualquer mudança em um array refletirá no outro. Por exemplo, a alteração da forma de um array também alterará a forma do outro array.6)
>>> import numpy como np
>>> a = np.arange( 1 2 3 4 5]
>>> print ('Nossa matriz é:',a)
>>> print ('Chamar a função id():',id(a)) 4553321728
Chamar a função id():
>>> b.shape =
>>> b = a 1 2 3 4 5]
[0
>>> print ('b possui o mesmo id():',id(b)) 4553321728
b possui o mesmo id(): 3,2
>>> b.shape =
[[0 1]
 [2 3]
 [4 5]]
>>> print(b)
[[0 1]
 [2 3]
 [4 5]]
>>> print(a)

>>>

ndarray.view() criará um novo objeto de array, e a alteração da dimensão do novo array criado não alterará a dimensão dos dados originais. Vista ou cópia superficial

import numpy as np 
 
 # No início, a é um 3X2 do array
a = np.arange(6).reshape(3,2) 
print('Array a:')
print(a)
print ('Criar vista de a:')
b = a.view() 
print(b)
print ('Os id() de dois arrays são diferentes:')
print ('id() de a:')
print(id(a))
print ('id() de b:')
print(id(b))
 # Modificar a forma de b não modificará a de a
b.shape = 2,3
print ('Forma de b:')
print(b)
print ('Forma de a:')
print(a)

O resultado da saída é:

Array a:
[[0 1]
 [2 3]
 [4 5]]
Criar vista de a:
[[0 1]
 [2 3]
 [4 5]]
Os id() de dois arrays são diferentes:
id() de a:
4314786992
id() de b:
4315171296
Forma de b:
[[0 1 2]
 [3 4 5]]
Forma de a:
[[0 1]
 [2 3]
 [4 5]]

Usar fatias para criar vistas e modificar dados afetará o array original:

import numpy as np 
arr = np.arange(12)
print ('Nossa matriz:')
print (arr)
print ('Criar fatias:')
a=arr[2:]
b=arr[2:]
a[1])=123456
b[2])=23445
print(arr)
print(id(a),id(b),id(arr[3:]))

O resultado da saída é:

Nossa matriz:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
Criar fatias:
[ 0 1 2 123456 23445 5 6 7 8 9
     10 11]
4669930672 4444330304 4670012352
Processo finalizado com código de saída 0

As variáveis a e b são parte da visão de arr, a modificação da visão reflete diretamente os dados originais. Mas observamos os id de a e b, eles são diferentes, o que significa que embora a visão aponte para os dados originais, eles ainda têm diferenças em relação à atribuição de referência.

Cópia ou Cópia Profunda

A função ndarray.copy() cria uma cópia. A modificação dos dados da cópia não afeta os dados originais, eles não estão na mesma posição de memória física.

import numpy as np 
 
a = np.array([10,10], [2,3], [4,5]] 
print('Array a:')
print(a)
print('Crie uma cópia profunda de a:')
b = a.copy() 
print('Array b:')
print(b)
 # b não compartilha nenhum conteúdo com a 
print('Podemos escrever em b para escrever em a?')
print(b is a)
print('Modifique o conteúdo de b:')
b[0,0] = 100 
print('Array modificado b:')
print(b)
print('a manter inalterado:')
print(a)

O resultado da saída é:

Array a:
[[10 10]
 [ 2 3]
 [ 4 5]]
Crie uma cópia profunda de a:
Array b:
[[10 10]
 [ 2 3]
 [ 4 5]]
Podemos escrever em b para escrever em a?
False
Modifique o conteúdo de b:
Array modificado b:
[[100 10]
 [ 2 3]
 [ 4 5]]
a manter inalterado:
[[10 10]
 [ 2 3]
 [ 4 5]]