14

来自 Matlab/Octave 的背景,我一直在尝试学习 numpy。一直困扰我的一件事是向量和多维数组之间的区别。对于这个问题,我将给出一个我遇到的具体问题,但如果有人还可以解释 numpy 中一维数组背后的更一般的图片,我将非常感激,为什么你首先想要它们,如何避免混合单维和多维数组等时出现麻烦。无论如何,问题是:

我有一个名为 X 的二维数组:

X = numpy.arange(10).reshape(2,5)

我想取 X 的最后一列并将其存储为另一个名为 Y 的二维数组(即列向量)。我能够为此提供的唯一方法是:

Y = numpy.atleast_2d(X[:,4]).T

但我不喜欢这样有几个原因:

  1. 当 X[:,4] 中应该隐含方向时,我觉得我不应该告诉它转置向量。

  2. 在代码中反复使用 atleast_2D 似乎很麻烦,这种情况会出现很多。感觉就像我做错了什么。

那么,简而言之,有没有更好的方法?

谢谢。

4

2 回答 2

42

首先,做你想做的事情的简单方法:

Y = X[:,4:]

现在,numpy 在您之前尝试它时没有这样做的原因与数组在 Python 中的工作方式有关,实际上在大多数编程语言中也是如此。当您编写类似a[4]的内容时,这是在访问数组的第五个元素,而不是让您查看原始数组的某些部分。例如,如果a是一个数字数组,那么a[4]将只是一个数字。如果a是二维数组,即实际上是数组的数组,那么a[4]将是一维数组。基本上,访问数组元素的操作会返回比原始数组少一维的东西。

现在,Python 包含了一种称为“切片表示法”的东西,它使用冒号表示,这是一种访问数组元素的不同方式。它不是返回一个元素(维数比原始数组小一的东西),而是返回原始数组的一部分的副本。本质上,a:b表示索引a(包括)到b(不包括)处的所有元素的列表。可以省略其中一个ab两个,在这种情况下,切片一直到数组的对应端。

这对您的情况意味着,当您编写 时X[:,4],您有一个切片表示法和一个常规索引表示法。切片表示法表示沿第一维的所有索引(只有 0 和 1,因为数组有两行),而 4 表示沿第二维的第五个元素。常规索引的每个实例基本上都会将返回对象的维数减少一维,因此由于X是二维数组,并且有一个常规索引,因此您会得到一维结果。Numpy 只是将一维数组显示为行向量。诀窍是,如果你想得到与开始时相同尺寸的东西,那就是使用所有切片索引,就像我在本文顶部的示例中所做的那样。

如果要提取总列数超过 5 列的内容的第五列,可以使用X[:,4:5]. 如果您想要查看第 3-4 行和第 5-7 列的视图,您可以使用X[3:5,5:8]. 希望你明白这一点。

于 2013-03-01T19:32:24.650 回答
0

子集

更简单的方法是对矩阵进行子集化。

>>> X
[[0 1 2 3 4]
 [5 6 7 8 9]]

>>> X[:, [4]]
[[4]
 [9]]

>>> X[:, 4]
[4 9]

它的工作原理有点类似于 Pandas 数据框。如果你索引数据框,它会给你一个Series。如果您对数据框进行子集化或切片,它会为您提供一个dataframe

也可以看看

于 2021-11-06T04:38:43.600 回答