介绍:
NumPy是一个Python程序库,用于处理大型多维数组和矩阵。同样的,NumPy中的数组又分为两类:复制数组和查看数组。复制数组会创建数组副本,对副本进行修改不影响原数组;查看数组不会创建副本,而是返回原数组的视图,对视图进行修改将影响原数组。深入了解这两种数组类型,对于NumPy应用非常重要。
一、复制数组
- 通过.copy()方法
使用.copy()方法可以创建新的数组副本。在复制过程中,会将原始数组所有的属性以及元素值复制到副本中。以下示例展示如何使用copy方法来创建新的数组副本:
import numpy as np
# 创建原始数组 a
a = np.array([[1, 2, 3], [4, 5, 6]])
# 使用copy()方法创建 b 数组副本
b = a.copy()
# 修改 b 数组
b[0][0] = 100
print("a:", a)
print("b:", b)
输出结果为:
a: [[1 2 3]
[4 5 6]]
b: [[100 2 3]
[ 4 5 6]]
由此可以看出,通过copy()
方法创建的数组副本是独立的副本,对副本进行修改不会影响原数组。
- 通过np.copy()方法
使用np.copy()方法同样可以实现创建新的数组副本。这种方法复制的原理与上述copy()
方法类似,只不过这种方法更灵活,可以设置复制的范围,更加灵活。以下示例展示如何使用np.copy()
方法来创建新的数组副本:
import numpy as np
# 创建原始数组 a
a = np.array([[1, 2, 3], [4, 5, 6]])
# 使用np.copy()方法创建 b 数组副本
b = np.copy(a)
# 修改 b 数组
b[0][0] = 100
print("a:", a)
print("b:", b)
输出结果为:
a: [[1 2 3]
[4 5 6]]
b: [[100 2 3]
[ 4 5 6]]
同样,np.copy()方法创建的数组副本也是独立的副本。
二、查看数组
- 通过np.view()方法
使用np.view()方法可以创建新的数组视图,该视图不会创建新的数组,而是返回原数组的视图。这意味着,原数组和视图数组共享相同的数据内存块,对视图进行修改也会影响原数组,下面是一个简单的例子:
import numpy as np
# 创建原始数组 a
a = np.array([[1, 2, 3], [4, 5, 6]])
# 创建视图数组 b,与a共享相同的数据内存块
b = a.view()
# 修改 b 数组
b[0][0] = 100
print("a:", a)
print("b:", b)
输出结果为:
a: [[100 2 3]
[ 4 5 6]]
b: [[100 2 3]
[ 4 5 6]]
由此可见,视图存在于原数组的数据内存块中,修改视图也会对原数组造成影响。
- 通过np.ndarray.view()方法
除了np.view()方法之外,我们还可以使用np.ndarray.view()方法来创建数组的视图。以下是一个简单的例子:
import numpy as np
# 创建原始数组 a
a = np.array([[1, 2, 3], [4, 5, 6]])
# 创建视图数组 b,与a共享相同的数据内存块
b = a.view(np.float32)
# 修改 b 数组
b[0][0] = 100.0
print("a:", a)
print("b:", b)
输出结果为:
a: [[ 1 2 3]
[ 4 5 6]]
b: [[ 100. 2. 3.]
[ 4. 5. 6.]]
从输出结果中可以看到,通过np.float32
参数设置了视图数组的数据类型,从而创建了一个浮点数类型的视图数组。修改视图数据后,原数组同样受到了影响。
总结:
通过上述两种方式,我们可以灵活地对NumPy中的数组进行复制和查看。复制会创建新的数组副本,而查看可以返回原数组的视图,实现不同结果的计算和处理,更加高效。