简介
在本实验中,你将学习使用 NumPy 数组的基础知识。NumPy 是 Python 中一个强大的数值计算库。它为在数组上执行数学运算提供了高效的数据结构和函数。
注意:你可以在
06-copies-and-views.ipynb
中编写代码。步骤中省略了一些打印操作,你可以根据需要打印输出。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在本实验中,你将学习使用 NumPy 数组的基础知识。NumPy 是 Python 中一个强大的数值计算库。它为在数组上执行数学运算提供了高效的数据结构和函数。
注意:你可以在
06-copies-and-views.ipynb
中编写代码。步骤中省略了一些打印操作,你可以根据需要打印输出。
NumPy 数组由两部分组成:数据缓冲区和元数据。数据缓冲区包含实际的数据元素,而元数据包括数据类型和步幅等信息。
在对 NumPy 数组进行操作时,理解副本和视图之间的区别很重要:
视图 允许你通过更改某些元数据来以不同方式访问数组,而无需更改数据缓冲区。对视图所做的任何更改都会反映在原始数组中。
副本 是一个新数组,它复制了数据缓冲区和元数据。对副本所做的更改不会影响原始数组。
可以通过更改数组的某些元数据来创建视图。这会创建一种查看数据的新方式,而无需复制数据。要创建视图,可以使用 ndarray
对象的 view()
方法。
import numpy as np
## 创建一个数组
x = np.array([1, 2, 3, 4, 5])
## 创建一个视图
y = x.view()
## 修改视图
y[0] = 10
## 打印原始数组
print(x) ## 输出: [10, 2, 3, 4, 5]
在上述示例中,视图 y
允许我们修改原始数组 x
。
可以通过复制数组的数据缓冲区和元数据来创建副本。要创建副本,可以使用 ndarray
对象的 copy()
方法。
import numpy as np
## 创建一个数组
x = np.array([1, 2, 3, 4, 5])
## 创建一个副本
y = x.copy()
## 修改副本
y[0] = 10
## 打印原始数组
print(x) ## 输出: [1, 2, 3, 4, 5]
在上述示例中,副本 y
与原始数组 x
相互独立。
NumPy 中的索引操作根据索引类型的不同,可能会创建视图或副本。
import numpy as np
## 创建一个数组
x = np.arange(10)
## 创建一个视图
y = x[1:3]
## 修改视图
y[0] = 10
## 打印原始数组
print(x) ## 输出: [0, 10, 2, 3, 4, 5, 6, 7, 8, 9]
在上述示例中,视图 y
反映了对原始数组 x
所做的更改。
import numpy as np
## 创建一个数组
x = np.arange(9).reshape(3, 3)
## 创建一个副本
y = x[[1, 2]]
## 修改原始数组
x[[1, 2]] = [[10, 11, 12], [13, 14, 15]]
## 打印副本
print(y) ## 输出: [[3, 4, 5], [6, 7, 8]]
在上述示例中,修改原始数组 x
后,副本 y
保持不变。
在NumPy中还有其他一些操作也可能会创建视图或副本。
reshape()
函数在可能的情况下创建视图,否则创建副本。例如:import numpy as np
## 创建一个数组
x = np.ones((2, 3))
## 转置数组
y = x.T
## 尝试重塑数组
try:
y.shape = 6
except AttributeError:
print("Incompatible shape for in-place modification. Use `.reshape()` to make a copy with the desired shape.")
在上述示例中,数组 y
在转置后变得不连续,因此重塑它需要进行复制。
ravel()
函数在可能的情况下返回数组的连续扁平视图。另一方面,flatten()
方法总是返回数组的扁平副本。例如:import numpy as np
## 创建一个数组
x = np.arange(9).reshape(3, 3)
## 创建一个扁平视图
y = x.ravel()
## 创建一个扁平副本
z = x.flatten()
## 打印原始数组
print(x) ## 输出: [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
在上述示例中,y
是一个视图,而 z
是一个副本。
你可以使用 ndarray
对象的 base
属性来判断一个数组是视图还是副本。对于视图,base
属性返回原始数组;对于副本,base
属性返回 None
。例如:
import numpy as np
## 创建一个数组
x = np.arange(9)
## 创建一个视图
y = x.reshape(3, 3)
## 创建一个副本
z = y[[2, 1]]
## 检查 y 是否是视图
print(y.base) ## 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8]
## 检查 z 是否是副本
print(z.base is None) ## 输出: True
在上述示例中,y
是视图,z
是副本。
在本实验中,你学习了使用NumPy数组的基础知识。你了解了副本和视图,以及如何创建它们。你还学习了索引操作和其他可能创建视图或副本的操作。最后,你学习了如何使用 base
属性来判断一个数组是视图还是副本。
通过理解这些概念并使用适当的方法,你可以使用NumPy高效地处理和分析数据。