在 Python 中使用各种函数时,有些函数返回输入数组的副本,而有些函数则返回视图。
副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。
视图不会影响副本。拥有数据,对视图所做的任何更改都会影响原始数组,对原始数组所做的任何更改都会影响视图。
无复制
使用简单创建的数组对象赋值运算符不创建数组对象的副本。相反,它与原始数组共享相同的 id。 Python 对象的 id 与 C 中的指针非常相似。此外,其中任何一个的任何更改都会反映在另一个中。
示例:
在下面的示例中,一个数组是使用简单的赋值运算符创建的,改变一个数组的形状也会改变另一个数组的形状。
import numpy as np
x = np.array([[1,2,3],
[4,5,6]])
#创建数组x的视图
y = x
#显示数组x
print("id of x =", id(x))
print("x =")
print(x)
#显示数组y
print("\nid of y =", id(y))
print("y =")
print(y)
#改变y的内容
#这将同时改变 x 和 y
y[0,0] = 100
#运算后,数组x
print("\nx =")
print(x)
#运算后,数组y
print("\ny =")
print(y)
上述代码的输出将是:
id of x = 140318694401200
x =
[[1 2 3]
[4 5 6]]
id of y = 140318694401200
y =
[[1 2 3]
[4 5 6]]
x =
[[100 2 3]
[ 4 5 6]]
y =
[[100 2 3]
[ 4 5 6]]
浅复制
NumPy ndarray.view() 返回数组的视图(浅拷贝)。创建的视图具有不同的 id,但对视图所做的任何更改都会影响原始数组。使用该函数的语法如下:
语法
numpy.ndarray.view([dtype][, type])
参数
dtype | 可选。 指定返回视图的数据类型描述符,例如 float32 或 int16。省略它会导致视图与原始数组具有相同的数据类型。 |
type | 可选。 指定返回视图的类型,例如ndarray或矩阵。同样,省略参数会导致类型保留。 |
返回值
返回数组的视图。
示例:
在下面的示例中,ndarray.view() 用于创建给定数组的视图(浅拷贝)。
import numpy as np
x = np.array([[1,2,3],
[4,5,6]])
#创建数组x的视图
y = x.view()
#显示数组x
print("id of x =", id(x))
print("x =")
print(x)
#显示数组y
print("\nid of y =", id(y))
print("y =")
print(y)
#改变y的内容
#这将同时改变 x 和 y
y[0,0] = 100
#运算后,数组x
print("\nx =")
print(x)
#运算后,数组y
print("\ny =")
print(y)
上述代码的输出将是:
id of x = 140004172440752
x =
[[1 2 3]
[4 5 6]]
id of y = 140004172443536
y =
[[1 2 3]
[4 5 6]]
x =
[[100 2 3]
[ 4 5 6]]
y =
[[100 2 3]
[ 4 5 6]]
深复制
NumPy ndarray.copy() 返回一个深层复制数组的副本。使用该函数的语法如下:
语法
numpy.ndarray.copy(order='C')
参数
order | 可选。 指定副本的内存布局。它可以从 {'C', 'F', 'A', 'K'} 中获取值。默认值为"C"。
|
示例:
在下面的示例中,ndarray.copy()用于复制给定的数组。
import numpy as np
x = np.array([[1,2,3],
[4,5,6]])
#创建数组x的副本
y = x.copy()
#显示数组x
print("id of x =", id(x))
print("x =")
print(x)
#显示数组y
print("\nid of y =", id(y))
print("y =")
print(y)
#改变y的内容
#这会改变 y 但不会改变 x
y[0,0] = 100
#运算后,数组x
print("\nx =")
print(x)
#运算后,数组y
print("\ny =")
print(y)
上述代码的输出将是:
id of x = 140389488063664
x =
[[1 2 3]
[4 5 6]]
id of y = 140389488066448
y =
[[1 2 3]
[4 5 6]]
x =
[[1 2 3]
[4 5 6]]
y =
[[100 2 3]
[ 4 5 6]]