如何在NumPy中为行和列设置轴

NumPy 数组为在 Python 中存储和操作数据提供了一种快速有效的方法。

它们在机器学习中表示向量和矩阵形式的数据特别有用。

NumPy 数组中的数据可以通过列和行索引直接访问,这相当直接。然而,有时我们需要对数组数据执行操作,例如按行或按列求和或求平均值,这需要指定操作的轴。

不幸的是,NumPy 数组上的按列和按行操作与我们从行和列索引获得的直觉不符,这可能会让初学者和经验丰富的机器学习从业者都感到困惑。具体来说,诸如求和之类的操作可以通过 **axis=0 进行按列**操作,而 **axis=1 进行按行**操作。

在本教程中,您将了解如何按行和按列访问和操作 NumPy 数组。

完成本教程后,您将了解:

  • 如何定义包含数据行和列的 NumPy 数组。
  • 如何通过行和列索引访问 NumPy 数组中的值。
  • 如何按行和列轴对 NumPy 数组执行操作。

让我们开始吧。

How to Set NumPy Axis for Rows and Columns in Python

如何在 Python 中设置 NumPy 行和列的轴
照片作者:Jonathan Cutrer,保留部分权利。

教程概述

本教程分为三个部分;它们是:

  1. 带行和列的 NumPy 数组
  2. NumPy 数组中的数据行和列
  3. 按行和列进行 NumPy 数组操作
    1. Axis=None 数组范围操作
    2. Axis=0 按列操作
    3. Axis=1 按行操作

带行和列的 NumPy 数组

在深入研究 NumPy 数组轴之前,让我们先回顾一下 NumPy 数组的知识。

通常在 Python 中,我们处理的是数字列表或数字列表的列表。例如,我们可以定义一个由两行三个数字组成的二维矩阵,如下所示:

NumPy 数组使我们能够以高效的方式定义和操作向量和数字矩阵,例如,比纯 Python 列表效率高得多。NumPy 数组称为 NDArrays,几乎可以具有任意数量的维度,尽管在机器学习中,我们最常处理的是一维和二维数组(或图像的三维数组)。

例如,我们可以通过 asarray() 函数将我们的列表的列表矩阵转换为 NumPy 数组

我们可以直接打印数组,并期望看到两行数字,其中每行有三个数字或列。

我们可以通过打印“shape”属性来总结数组的维度,它是一个元组,其中元组中的值数量定义了维度数量,而每个位置上的整数定义了维度的大小。

例如,我们期望数组的 shape 为 (2,3),表示两行三列。

将所有内容结合起来,完整的示例列示如下。

运行示例会将我们的数据定义为列表的列表,将其转换为 NumPy 数组,然后打印数据和 shape。

我们可以看到,当数组打印出来时,它具有预期的形状,即两行三列。然后,我们可以看到打印出的 shape 与我们的预期相符。

有关 NumPy 数组基础知识的更多信息,请参阅本教程

到目前为止,一切顺利。

但是,我们如何按行或按列访问数组中的数据呢?更重要的是,我们如何按行或按列对数组执行操作呢?

让我们仔细看看这些问题。

NumPy 数组中的数据行和列

shape”属性总结了我们数据的维度。

重要的是,第一个维度定义了行数,第二个维度定义了列数。例如,(2,3) 定义了一个具有两行三列的数组,正如我们在上一节中看到的。

我们可以通过枚举从索引 0 到数组 shape 的第一个维度(例如 shape[0])来枚举数组中的每一行数据。我们可以通过行和列索引来访问数组中的数据。

例如,data[0, 0] 是第一行第一列的值,而 data[0, :] 是第一行的所有列的值,即我们矩阵中的完整第一行。

下面的示例枚举了数据中的所有行,并逐行打印。

正如预期的那样,结果显示了第一行数据,然后是第二行数据。

我们可以对列实现相同的效果。

也就是说,我们可以按列枚举数据。例如,data[:, 0] 访问第一列的所有行。我们可以枚举从第 0 列到“shape”属性第二个维度定义的最后一列的所有列,例如 shape[1]。

下面的示例通过枚举我们矩阵中的所有列来演示这一点。

运行示例将枚举并打印矩阵中的每一列。

鉴于矩阵有三列,我们可以看到结果是我们打印了三列,每一列都作为一个一维向量。即第一列(索引 0)值为 1 和 4,第二列(索引 1)值为 2 和 5,第三列(索引 2)值为 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 等)的默认设置。

下面的示例演示了对数组中的所有值进行求和,即数组范围操作。

运行示例将首先打印数组,然后按数组范围执行求和操作并打印结果。

我们可以看到数组有六个值,手动相加将得到 21,而按数组范围执行的求和操作结果符合此预期。

Axis=0 按列操作

在 NumPy 数组上执行操作时将 **axis=0** 设置为按列执行操作,即跨所有行对每个列进行操作。

例如,给定我们具有两行三列的数据

我们期望使用 axis=0 按列求和的结果将得到三个值,每个列一个,如下所示:

  • 第一列: 1 + 4 = 5
  • 第二列: 2 + 5 = 7
  • 第三列: 3 + 6 = 9

下面的示例演示了按列对数组中的值进行求和,即按列操作。

运行示例将首先打印数组,然后按列执行求和操作并打印结果。

我们可以看到数组具有预期的六个值,两行三列;然后我们可以看到按列操作的结果是一个包含三个值的向量,每个列的和值都符合我们的预期。

Axis=1 按行操作

在 NumPy 数组上执行操作时将 axis=1 设置为按行执行操作,即跨所有列对每一行进行操作。

例如,给定我们具有两行三列的数据

我们期望使用 axis=1 按行求和的结果将得到两个值,每个行一个,如下所示:

  • 第一行: 1 + 2 + 3 = 6
  • 第二行: 4 + 5 + 6 = 15

下面的示例演示了按行对数组中的值进行求和,即按行操作。

运行示例将首先打印数组,然后按行执行求和操作并打印结果。

我们可以看到数组具有预期的六个值,两行三列;然后我们可以看到按行操作的结果是一个包含两个值的向量,每个行的和值都符合我们的预期。

现在我们对如何在对 NumPy 数组执行操作时适当地设置轴有了具体的了解。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

教程

API

总结

在本教程中,您了解了如何按行和按列访问和操作 NumPy 数组。

具体来说,你学到了:

  • 如何定义包含数据行和列的 NumPy 数组。
  • 如何通过行和列索引访问 NumPy 数组中的值。
  • 如何按行和列轴对 NumPy 数组执行操作。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握机器学习线性代数!

Linear Algebra for Machine Learning

建立对线性代数的工作理解

...通过在 python 中编写代码

在我的新电子书中探索如何实现
机器学习线性代数

它提供关于以下主题的自学教程
向量范数、矩阵乘法、张量、特征分解、SVD、PCA 等等...

最终理解数据的数学

跳过学术理论。只看结果。

查看内容

如何在 NumPy 中设置行和列的轴 的 2 条回复

  1. Sifa 2020年9月9日 10:05 am #

    多么棒的教程!
    感谢分享,博士。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。