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
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
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
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
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