在 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"。
  • 'C' - 表示 C 顺序(主要行)。
  • 'F' - 表示 F 顺序(主要列)。
  • 'A' - F if a 是 Fortran 连续的,否则是 C。
  • 'K' - 尽可能匹配 a 的布局。

示例:

在下面的示例中,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]]