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