【问题标题】:Row vs. Column Vector Return during Numpy Array SlicingNumpy 数组切片期间的行与列向量返回
【发布时间】:2015-06-20 13:04:23
【问题描述】:

我目前正在学习 Python,在执行基本的数组切片命令时偶然发现了一个让我有点困惑的结果。

我使用这个命令创建了一个 4x5 矩阵:

>>> a = numpy.arange(20).reshape(4,5)

这给出了:

[[ 0, 1, 2, 3, 4],
 [ 5, 6, 7, 8, 9],
 [10,11,12,13,14],
 [15,16,17,18,19]]

如果我像这样索引数组:

>>> a[0:3, 2]

我得到一个行向量:

[2, 7, 12]

但是如果我像这样索引数组:

>>> a[0:3, 2:3]

我得到一个列向量:

[[ 2],
 [ 7],
 [12]]

当插入两个命令时,我希望结果是相同的,那为什么我得到不同类型的向量?

谢谢!

【问题讨论】:

  • 请注意,您的第二个示例等效于:a[0:3, [2]]

标签: python arrays numpy vector slice


【解决方案1】:

tl;dr 版本

在 numpy 中,沿数组的维度获取单个索引会将维度减少 1,因此从二维数组获取索引会生成一维数组(第一种情况)。沿一个维度取一个切片保持相同的维度,即使切片的长度为 1,所以取一个 2D 数组的长度为 1 的切片仍然是一个 2D 数组(第二种情况)

详细版

问题在于第一个结果不是行向量,而是一维数组。当您从一个维度中获取单个标量索引时,它会将维度数减少 1。因此,从 4D 数组中获取标量索引使其成为 3D 数组,从 3D 数组中获取一个使其成为 2D 数组,2D 数组一维数组和一维数组到标量。

这是为了保持一致性。如果从一维数组中取出一个项目是一个标量(将维度减少一),那么通过扩展,高维等效操作应该以等效的方式表现。

在第二种情况下,您获取的是切片,而不是标量。当你这样做时,它会保留维度的数量。因此,即使切片为空(或在您的情况下长度为 1),获取 2D 数组的切片始终是 2D 数组。这也是为了一致性。如果二维数组的长度为 3 的切片是二维数组,而二维数组的长度为 2 的切片是二维数组,那么二维数组的长度为 1 的切片也应该是二维数组。

这也是一种方便的约定,因为它允许您在几个字符中明确定义是否要降低维度。

一些语言,比如 MATLAB,没有一维数组(或者,从技术上讲,矩阵)的概念,数组可以是 0D(标量)、2D、3D 等,但不能是 1D。另一方面,Python 允许使用真正的一维数组,这可能会使不习惯它的人绊倒。

【讨论】:

  • 谢谢!这很有帮助,而且 Python 能够使用如此简单的命令来控制尺寸,这非常酷。
【解决方案2】:

如果你使用两个切片,你会得到两个维度。尽管您在第二个示例中得到的有时称为“列向量”,但它实际上是一个 Nx1 二维数组。这与您在第一个示例中得到的不同,它根本不是二维的,而是一维数组。

您使用切片而不是单个值的事实是导致额外维度的原因。 Numpy 不会查看切片实际抓取的元素数量;它只是查看您是否使用了切片。如果a[0:3, 2:3]返回的是一维向量,而a[0:3, 1:3]返回的是二维数组,那就更混乱了。

【讨论】:

    【解决方案3】:

    为什么会有不同的命令。

    在第一种情况下,您将获得前三行以及其中的第三个元素。这将只返回元素。

    在第二种情况下,您获得前三行并指定第三列的两个元素。此列将返回它,或者一个元素的向量

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2015-10-03
      • 2015-04-10
      • 1970-01-01
      相关资源
      最近更新 更多