python - Numpy 数组切片期间的行与列向量返回

标签 python arrays numpy vector slice

我目前正在学习 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]]

插入这两个命令时,我预计结果是相同的,但为什么我会得到不同类型的向量?

谢谢!

最佳答案

tl;dr 版本

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

详细版

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

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

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

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

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

关于python - Numpy 数组切片期间的行与列向量返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635501/

相关文章:

python - 多重继承中基类的顺序和 super() 的使用

python - torch.einsum 的内存使用

python - 创建从第 x 天开始的自定义月份

python - 根据一列的值从二维矩阵中提取值

python - OpenCV Ubuntu 安装 undefined symbol

linux - Python RegEx 捕捉数组名称和大小之间的空白

Ruby 的变量交换 : x, y = y,x -- 数组引用似乎更慢?

jquery - 如何检查数组是否是多维的? (jQuery)

python - 与 numba 的 prange 并行并传递元组

python - 使用 Python Pandas 跳过 csv 文件中的行