English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La copia es una copia completa de los datos, si se realiza un cambio en la copia, no afectará a los datos originales, la memoria física no está en la misma posición.
La vista es un alias o referencia de los datos, a través del cual se puede acceder y operar los datos originales, pero no se realiza una copia de los datos originales. Si modificamos la vista, afectará a los datos originales, en la misma posición de la memoria física.
La principal diferencia entre la copia y la vista de array es que la copia es un nuevo array, mientras que esta vista es solo una vista del array original.La copia posee datos, cualquier cambio realizado en la copia no afectará al array original, y cualquier cambio realizado en el array original no afectará a la copia.La vista no posee datos, cualquier cambio realizado en la vista afectará al array original, y cualquier cambio realizado en el array original afectará a la vista.
1、La operación de rebanado de numpy devuelve una vista del datos originales.2、Se crea una vista utilizando la función view() de ndarray.
Operación de rebanado de secuencia de Python, llamada función deepCopy().Se crea una copia utilizando la función copy() de ndarray.
简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
Sin copia >>> Asignación simple no creará una copia del objeto de array. En su lugar, usará el mismo id() del array original para acceder a él. id() devuelve el identificador universal del objeto Python, similar a un puntero en C. Además, cualquier cambio en un array se reflejará en el otro. Por ejemplo, un cambio en la forma de un array también cambiará la forma del otro array.6) >>> import numpy como np >>> a = np.arange( 1 2 3 4 5] >>> print ('Nuestra matriz es:',a) >>> print ('Llamar a la función id():',id(a)) 4553321728 Llamar a la función id(): >>> b.shape = >>> b = a 1 2 3 4 5] [0 >>> print ('b tiene el mismo id():',id(b)) 4553321728 b tiene el mismo id(): 3,2 >>> b.shape = [[0 1] [2 3] [4 5]] >>> print (b) [[0 1] [2 3] [4 5]] >>> print (a)
ndarray.view() solo creará un nuevo objeto de array, el método creado por este nuevo array no cambiará la dimensión de los datos originales. Vista o copia superficial
import numpy as np # Al principio a es un 3X2 del array a = np.arange(6).reshape(3,2) print ('数组 a:') print (a) print ('Crear vista de a:') b = a.view() print (b) print ('Los id() de dos arrays son diferentes:') print ('id() de a:') print (id(a)) print ('id() de b:') print (id(b)) # Modificar la forma de b no modificará a b.shape = 2,3 print ('Forma de b:') print (b) print ('Forma de a:') print (a)
输出结果为:
数组 a: [[0 1] [2 3] [4 5]] Crear vista de a: [[0 1] [2 3] [4 5]] Los id() de dos arrays son 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]]
Modificar datos con vistas de rebanadas afectará al array original:
import numpy as np arr = np.arange(12) print ('Nuestra matriz:') print (arr) print ('Crear rebanadas:') a=arr[2:] b=arr[2:] a[1])=123456 b[2])=23445 print(arr) print(id(a),id(b),id(arr[3:]))
输出结果为:
Nuestra matriz: [ 0 1 2 3 4 5 6 7 8 9 10 11] Crear rebanadas: [ 0 1 2 123456 23445 5 6 7 8 9 10 11] 4669930672 4444330304 4670012352 Proceso finalizado con código de salida 0
变量a,b都是arr的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察a,b的id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。
函数copy()ndarray创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
import numpy as np a = np.array([[10,10], [2,3], [4,5]] print ('数组 a:') print (a) print ('创建 a 的深层副本:') b = a.copy() print ('数组 b:') print (b) # b 与 a 不共享任何内容 print ('我们能够写入 b 来写入 a 吗?') print (b is a) print ('修改 b 的内容:') b[0,0] = 100 print ('修改后的数组 b:') print (b) print ('a 保持不变:') print (a)
输出结果为:
数组 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]]