Numpy 数组切片期间的行与列向量 Return
Row vs. Column Vector Return during Numpy Array Slicing
我目前正在学习 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]]
插入这两个命令时,我预计结果会相同,但为什么我会得到不同类型的向量?
谢谢!
如果使用两个切片,则会得到两个维度。尽管您在第二个示例中得到的有时称为 "column vector",但它实际上是一个 Nx1 二维数组。这与您在第一个示例中得到的不同,它根本不是二维的,而是一维数组。
您使用切片而不是单个值这一事实是导致额外维度的原因。 Numpy 不会查看切片实际获取的元素数量;它只是看你是否使用了切片。如果 a[0:3, 2:3]
返回一个一维向量,但 a[0:3, 1:3]
返回一个二维数组,那就更令人困惑了。
tl;dr 版本
在 numpy 中,沿数组的维度获取单个索引会将维数减少 1,因此从二维数组获取索引会生成一维数组(第一种情况)。沿一个维度取一个切片保持相同的维度,即使切片的长度为1,所以取一个二维数组的长度为1的切片仍然是一个二维数组(第二种情况)
详细版
问题是第一个结果不是行向量,而是一维数组。当您从维度中获取单个标量索引时,它会将维度数减少 1。因此,从 4D 数组中获取标量索引使其成为 3D 数组,从 3D 数组中获取一个标量索引使其成为 2D 数组,2D 数组为一维数组和一维数组到标量。
这是为了保持一致性。如果从一维数组中取出一个项目是一个标量(将维数减少一),那么通过扩展,更高维的等效操作应该以等效的方式表现。
在第二种情况下,您获取的是切片,而不是标量。当您这样做时,它会保留维数。因此,即使切片为空(或在您的情况下长度为 1),获取二维数组的切片始终是二维数组。这也是为了一致性。如果二维数组的长度为 3 的切片是二维数组,二维数组的长度为 2 的切片是二维数组,那么二维数组的长度为 1 的切片也应该是二维数组。
这也是一个方便的约定,因为它允许您仅用几个字符明确定义是否要降维。
一些语言,如 MATLAB,没有一维数组(或者,技术上,矩阵)的概念,数组可以是 0D(标量)、2D、3D 等,但不是 1D。另一方面,Python 允许使用真正的一维数组,这会使不习惯它的人感到困惑。
为什么命令不同。
在第一种情况下,您将获得前三行以及其中的第三个元素。这将 return 你只有元素。
在第二种情况下你得到前三行并指定第三列的两个元素。这一列将return它,或者一个有一个元素的向量
我目前正在学习 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]]
插入这两个命令时,我预计结果会相同,但为什么我会得到不同类型的向量?
谢谢!
如果使用两个切片,则会得到两个维度。尽管您在第二个示例中得到的有时称为 "column vector",但它实际上是一个 Nx1 二维数组。这与您在第一个示例中得到的不同,它根本不是二维的,而是一维数组。
您使用切片而不是单个值这一事实是导致额外维度的原因。 Numpy 不会查看切片实际获取的元素数量;它只是看你是否使用了切片。如果 a[0:3, 2:3]
返回一个一维向量,但 a[0:3, 1:3]
返回一个二维数组,那就更令人困惑了。
tl;dr 版本
在 numpy 中,沿数组的维度获取单个索引会将维数减少 1,因此从二维数组获取索引会生成一维数组(第一种情况)。沿一个维度取一个切片保持相同的维度,即使切片的长度为1,所以取一个二维数组的长度为1的切片仍然是一个二维数组(第二种情况)
详细版
问题是第一个结果不是行向量,而是一维数组。当您从维度中获取单个标量索引时,它会将维度数减少 1。因此,从 4D 数组中获取标量索引使其成为 3D 数组,从 3D 数组中获取一个标量索引使其成为 2D 数组,2D 数组为一维数组和一维数组到标量。
这是为了保持一致性。如果从一维数组中取出一个项目是一个标量(将维数减少一),那么通过扩展,更高维的等效操作应该以等效的方式表现。
在第二种情况下,您获取的是切片,而不是标量。当您这样做时,它会保留维数。因此,即使切片为空(或在您的情况下长度为 1),获取二维数组的切片始终是二维数组。这也是为了一致性。如果二维数组的长度为 3 的切片是二维数组,二维数组的长度为 2 的切片是二维数组,那么二维数组的长度为 1 的切片也应该是二维数组。
这也是一个方便的约定,因为它允许您仅用几个字符明确定义是否要降维。
一些语言,如 MATLAB,没有一维数组(或者,技术上,矩阵)的概念,数组可以是 0D(标量)、2D、3D 等,但不是 1D。另一方面,Python 允许使用真正的一维数组,这会使不习惯它的人感到困惑。
为什么命令不同。
在第一种情况下,您将获得前三行以及其中的第三个元素。这将 return 你只有元素。
在第二种情况下你得到前三行并指定第三列的两个元素。这一列将return它,或者一个有一个元素的向量