NumPy 数组为在 Python 中存储和操作数据提供了一种快速有效的方法。
它们在机器学习中表示向量和矩阵形式的数据特别有用。
NumPy 数组中的数据可以通过列和行索引直接访问,这相当直接。然而,有时我们需要对数组数据执行操作,例如按行或按列求和或求平均值,这需要指定操作的轴。
不幸的是,NumPy 数组上的按列和按行操作与我们从行和列索引获得的直觉不符,这可能会让初学者和经验丰富的机器学习从业者都感到困惑。具体来说,诸如求和之类的操作可以通过 **axis=0 进行按列**操作,而 **axis=1 进行按行**操作。
在本教程中,您将了解如何按行和按列访问和操作 NumPy 数组。
完成本教程后,您将了解:
- 如何定义包含数据行和列的 NumPy 数组。
- 如何通过行和列索引访问 NumPy 数组中的值。
- 如何按行和列轴对 NumPy 数组执行操作。
让我们开始吧。

如何在 Python 中设置 NumPy 行和列的轴
照片作者:Jonathan Cutrer,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- 带行和列的 NumPy 数组
- NumPy 数组中的数据行和列
- 按行和列进行 NumPy 数组操作
- Axis=None 数组范围操作
- Axis=0 按列操作
- Axis=1 按行操作
带行和列的 NumPy 数组
在深入研究 NumPy 数组轴之前,让我们先回顾一下 NumPy 数组的知识。
通常在 Python 中,我们处理的是数字列表或数字列表的列表。例如,我们可以定义一个由两行三个数字组成的二维矩阵,如下所示:
1 2 3 |
... # 将数据定义为列表 data = [[1,2,3], [4,5,6]] |
NumPy 数组使我们能够以高效的方式定义和操作向量和数字矩阵,例如,比纯 Python 列表效率高得多。NumPy 数组称为 NDArrays,几乎可以具有任意数量的维度,尽管在机器学习中,我们最常处理的是一维和二维数组(或图像的三维数组)。
例如,我们可以通过 asarray() 函数将我们的列表的列表矩阵转换为 NumPy 数组
1 2 3 |
... # 转换为 NumPy 数组 data = asarray(data) |
我们可以直接打印数组,并期望看到两行数字,其中每行有三个数字或列。
1 2 3 |
... # 总结数组内容 print(data) |
我们可以通过打印“shape”属性来总结数组的维度,它是一个元组,其中元组中的值数量定义了维度数量,而每个位置上的整数定义了维度的大小。
例如,我们期望数组的 shape 为 (2,3),表示两行三列。
1 2 3 |
... # 总结数组 shape print(data.shape) |
将所有内容结合起来,完整的示例列示如下。
1 2 3 4 5 6 7 8 9 10 |
# 创建并总结 NumPy 数组 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 总结数组内容 print(data) # 总结数组 shape print(data.shape) |
运行示例会将我们的数据定义为列表的列表,将其转换为 NumPy 数组,然后打印数据和 shape。
我们可以看到,当数组打印出来时,它具有预期的形状,即两行三列。然后,我们可以看到打印出的 shape 与我们的预期相符。
1 2 3 |
[[1 2 3] [4 5 6]] (2, 3) |
有关 NumPy 数组基础知识的更多信息,请参阅本教程
到目前为止,一切顺利。
但是,我们如何按行或按列访问数组中的数据呢?更重要的是,我们如何按行或按列对数组执行操作呢?
让我们仔细看看这些问题。
NumPy 数组中的数据行和列
“shape”属性总结了我们数据的维度。
重要的是,第一个维度定义了行数,第二个维度定义了列数。例如,(2,3) 定义了一个具有两行三列的数组,正如我们在上一节中看到的。
我们可以通过枚举从索引 0 到数组 shape 的第一个维度(例如 shape[0])来枚举数组中的每一行数据。我们可以通过行和列索引来访问数组中的数据。
例如,data[0, 0] 是第一行第一列的值,而 data[0, :] 是第一行的所有列的值,即我们矩阵中的完整第一行。
下面的示例枚举了数据中的所有行,并逐行打印。
1 2 3 4 5 6 7 8 9 |
# 枚举 NumPy 数组中的行 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 遍历行 for row in range(data.shape[0]): print(data[row, :]) |
正如预期的那样,结果显示了第一行数据,然后是第二行数据。
1 2 |
[1 2 3] [4 5 6] |
我们可以对列实现相同的效果。
也就是说,我们可以按列枚举数据。例如,data[:, 0] 访问第一列的所有行。我们可以枚举从第 0 列到“shape”属性第二个维度定义的最后一列的所有列,例如 shape[1]。
下面的示例通过枚举我们矩阵中的所有列来演示这一点。
1 2 3 4 5 6 7 8 9 |
# 枚举 NumPy 数组中的列 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 遍历列 for col in range(data.shape[1]): print(data[:, col]) |
运行示例将枚举并打印矩阵中的每一列。
鉴于矩阵有三列,我们可以看到结果是我们打印了三列,每一列都作为一个一维向量。即第一列(索引 0)值为 1 和 4,第二列(索引 1)值为 2 和 5,第三列(索引 2)值为 3 和 6。
它看起来有点奇怪,因为我们的列不像列;它们被侧放了,而不是垂直的。
1 2 3 |
[1 4] [2 5] [3 6] |
现在我们知道如何按列和按行访问 NumPy 数组中的数据了。
到目前为止一切顺利,但如何按列和按行对数组进行操作呢?接下来就是这个。
按行和列进行 NumPy 数组操作
我们经常需要按列或按行对 NumPy 数组执行操作。
例如,我们可能需要按行或按列对数据矩阵进行求和或计算平均值。
这可以通过使用 sum() 或 mean() NumPy 函数并指定要执行操作的“axis”来实现。
我们可以将轴指定为要执行操作的维度,而此维度与我们根据数组“shape”的解释以及我们在数组中索引数据的方式获得的直觉不符。
因此,这会给初学者带来最大的困惑.
也就是说,**axis=0** 将按列执行操作,**axis=1** 将按行执行操作。我们还可以将轴指定为 None,这将对整个数组执行操作。
总结一下:
- axis=None:对整个数组执行操作。
- axis=0:按列执行操作,对每列的所有行进行操作。
- axis=1:按行执行操作,对每行的所有列进行操作。
我们通过一个实例来具体说明。
我们将对我们数组中的值按这三个轴进行求和。
Axis=None 数组范围操作
在 NumPy 数组上执行操作时将 **axis=None** 设置为数组范围操作。
这通常是大多数操作(如 sum、mean、std 等)的默认设置。
1 2 3 |
... # 按数组对数据求和 result = data.sum(axis=None) |
下面的示例演示了对数组中的所有值进行求和,即数组范围操作。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 按数组范围对值求和 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 总结数组内容 print(data) # 按数组对数据求和 result = data.sum(axis=None) # 总结结果 print(result) |
运行示例将首先打印数组,然后按数组范围执行求和操作并打印结果。
我们可以看到数组有六个值,手动相加将得到 21,而按数组范围执行的求和操作结果符合此预期。
1 2 3 4 |
[[1 2 3] [4 5 6]] 21 |
Axis=0 按列操作
在 NumPy 数组上执行操作时将 **axis=0** 设置为按列执行操作,即跨所有行对每个列进行操作。
1 2 3 |
... # 按列对数据求和 result = data.sum(axis=0) |
例如,给定我们具有两行三列的数据
1 2 |
Data = [[1, 2, 3], 4, 5, 6]] |
我们期望使用 axis=0 按列求和的结果将得到三个值,每个列一个,如下所示:
- 第一列: 1 + 4 = 5
- 第二列: 2 + 5 = 7
- 第三列: 3 + 6 = 9
下面的示例演示了按列对数组中的值进行求和,即按列操作。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 按列对值求和 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 总结数组内容 print(data) # 按列对数据求和 result = data.sum(axis=0) # 总结结果 print(result) |
运行示例将首先打印数组,然后按列执行求和操作并打印结果。
我们可以看到数组具有预期的六个值,两行三列;然后我们可以看到按列操作的结果是一个包含三个值的向量,每个列的和值都符合我们的预期。
1 2 3 |
[[1 2 3] [4 5 6]] [5 7 9] |
Axis=1 按行操作
在 NumPy 数组上执行操作时将 axis=1 设置为按行执行操作,即跨所有列对每一行进行操作。
1 2 3 |
... # 按行对数据求和 result = data.sum(axis=1) |
例如,给定我们具有两行三列的数据
1 2 |
Data = [[1, 2, 3], 4, 5, 6]] |
我们期望使用 axis=1 按行求和的结果将得到两个值,每个行一个,如下所示:
- 第一行: 1 + 2 + 3 = 6
- 第二行: 4 + 5 + 6 = 15
下面的示例演示了按行对数组中的值进行求和,即按行操作。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 按行对值求和 from numpy import asarray # 将数据定义为列表 data = [[1,2,3], [4,5,6]] # 转换为 NumPy 数组 data = asarray(data) # 总结数组内容 print(data) # 按行对数据求和 result = data.sum(axis=1) # 总结结果 print(result) |
运行示例将首先打印数组,然后按行执行求和操作并打印结果。
我们可以看到数组具有预期的六个值,两行三列;然后我们可以看到按行操作的结果是一个包含两个值的向量,每个行的和值都符合我们的预期。
1 2 3 |
[[1 2 3] [4 5 6]] [ 6 15] |
现在我们对如何在对 NumPy 数组执行操作时适当地设置轴有了具体的了解。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
教程
API
总结
在本教程中,您了解了如何按行和按列访问和操作 NumPy 数组。
具体来说,你学到了:
- 如何定义包含数据行和列的 NumPy 数组。
- 如何通过行和列索引访问 NumPy 数组中的值。
- 如何按行和列轴对 NumPy 数组执行操作。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
多么棒的教程!
感谢分享,博士。
谢谢!