Copias y vistas de NumPy

Una copia es una copia completa de los datos. Si modificamos la copia, no afectará a los datos originales; la memoria física no está en la misma ubicación.

Una vista es un alias o referencia a los datos. A través de este alias o referencia se puede acceder y manipular los datos originales, pero los datos originales no se copian. Si modificamos la vista, afectará a los datos originales; la memoria física está en la misma ubicación.

Las vistas generalmente ocurren en:

  • 1. Las operaciones de segmentación (slicing) de numpy devuelven una vista de los datos originales.
  • 2. Llamar a la función view() de ndarray produce una vista.

Las copias generalmente ocurren en:

  • Las operaciones de segmentación de secuencias de Python, al llamar a la función deepCopy().
  • Llamar a la función copy() de ndarray produce una copia.

Sin copia

La asignación simple no crea una copia del objeto de matriz. En su lugar, utiliza el mismo id() de la matriz original para acceder a ella. id() devuelve un identificador universal del objeto de Python, similar a un puntero en C.

Además, cualquier cambio en un arreglo se refleja en el otro. Por ejemplo, si se cambia la forma de un arreglo, también cambiará la forma del otro.

Ejemplo

import numpy as np a = np.arange(6) print ('Nuestro arreglo es:') print (a) print ('Llamando a la función id():') print (id(a)) print ('Asignando a a b:') b = a print (b) print ('b tiene el mismo id():') print (id(b)) print ('Modificando la forma de b:') b.shape = 3,2 print (b) print ('La forma de a también se modificó:') print (a)

El resultado es:

我们的数组是:
[0 1 2 3 4 5]
调用 id() 函数:
4349302224
a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id():
4349302224
修改 b 的形状:
[[0 1]
 [2 3]
 [4 5]]
a 的形状也修改了:
[[0 1]
 [2 3]
 [4 5]]

Vista o copia superficial

El método ndarray.view() crea un nuevo objeto de arreglo. Los cambios en las dimensiones del nuevo arreglo creado por este método no cambiarán las dimensiones de los datos originales.

Ejemplo

import numpy as np # Inicialmente a es un arreglo de 3X2 a = np.arange(6).reshape(3,2) print ('Arreglo a:') print (a) print ('Creando una vista de a:') b = a.view() print (b) print ('Los id() de los dos arreglos son diferentes:') print ('id() de a:') print (id(a)) print ('id() de b:' ) print (id(b)) # Modificar la forma de b no modifica a b.shape = 2,3 print ('Forma de b:') print (b) print ('Forma de a:') print (a)

El resultado es:

数组 a:
[[0 1]
 [2 3]
 [4 5]]
创建 a 的视图:
[[0 1]
 [2 3]
 [4 5]]
两个数组的 id() 不同:
a 的 id():
4314786992
b 的 id():
4315171296
b 的形状:
[[0 1 2]
 [3 4 5]]
a 的形状:
[[0 1]
 [2 3]
 [4 5]]

Usar segmentación para crear una vista y modificar datos afectará al arreglo original:

Ejemplo

import numpy as np arr = np.arange(12) print ('Nuestro arreglo:') print (arr) print ('Creando una segmentación:') a=arr[3:] b=arr[3:] a[1]=123 b[2]=234 print(arr) print(id(a),id(b),id(arr[3:]))

El resultado es:

我们的数组:
[ 0  1  2  3  4  5  6  7  8  9 10 11]
创建切片:
[  0   1   2   3 123 234   6   7   8   9  10  11]
4545878416 4545878496 4545878576

Las variables a y b son vistas de una parte de arr. Las modificaciones a la vista se reflejarán directamente en los datos originales. Sin embargo, si observamos los id de a y b, son diferentes. Es decir, aunque las vistas apuntan a los datos originales, todavía se diferencian de las referencias por asignación.

Copia o copia profunda

La función ndarray.copy() crea una copia. Modificar los datos de la copia no afectará a los datos originales; su memoria física no está en la misma ubicación.

Ejemplo

import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print ('Arreglo a:') print (a) print ('Creando una copia profunda de a:') b = a.copy() print ('Arreglo b:') print (b) # b y a no comparten nada print ('¿Podemos escribir en b para escribir en a?') print (b is a) print ('Modificando el contenido de b:') b[0,0] = 100 print ('Arreglo b después de la modificación:') print (b) print ('a permanece sin cambios:') print (a)

El resultado es:

数组 a:
[[10 10]
 [ 2  3]
 [ 4  5]]
创建 a 的深层副本:
数组 b:
[[10 10]
 [ 2  3]
 [ 4  5]]
我们能够写入 b 来写入 a 吗?
False
修改 b 的内容:
修改后的数组 b:
[[100  10]
 [  2   3]
 [  4   5]]
a 保持不变:
[[10 10]
 [ 2  3]
 [ 4  5]]

Más artículos relacionados

Análisis de asignación directa, copia superficial y copia profunda en Python

Otras extensiones