来自Matlab / Octave的背景,我一直在尝试学习numpy。一遍又一遍让我绊倒的一件事是向量与多维数组之间的区别。对于这个问题,我将给出一个具体的问题,但是如果有人还可以解释numpy中一维数组背后的更一般的图片,我将非常感激,为什么首先要使用它们,如何为了避免在混合一维和多维数组等时遇到麻烦。无论如何,问题是:
我有一个称为X的二维数组:
X = numpy.arange(10).reshape(2,5)
我想将X的最后一列存储为另一个称为Y的2-D数组(即列向量)。为此,我能够提供的唯一方法是:
Y = numpy.atleast_2d(X[:,4]).T
但由于几个原因,我不喜欢这样:
当不需要在X [:,4]中隐含方向时,我不认为应该告诉它转置向量。
反复使用atleast_2D似乎很麻烦,因为这种情况会在代码中反复使用。好像我做错了什么。
简而言之,有没有更好的方法?
谢谢。
首先,做您想要的事情的简单方法:
Y = X[:,4:]
现在,之前尝试使用numpy而不执行此操作的原因与数组在Python中以及实际上在大多数编程语言中的工作方式有关。当您编写类似的内容时a[4],这将访问数组的第五个元素,而不是让您查看原始数组的某些部分。因此,例如,如果a是一个数字数组,a[4]则将只是一个数字。如果a是二维数组,即有效地是数组数组,a[4]则将是一维数组。基本上,访问数组元素的操作返回的维数比原始数组小一。
a[4]
a
现在,Python包含了一个叫做“切片符号”的东西,它用冒号表示,这是访问数组元素的另一种方式。它不返回 元素 (维数比原始数组小一个的 元素 ),而是返回原始数组的一部分的副本。本质上,a:b代表索引a(包括)到b(排除)处的所有元素的列表。任一a或b或两者都可以被省略,在这种情况下,片去一路到阵列的相应的端部。
a:b
b
这对于您的情况意味着在编写时X[:,4],您将具有一个切片符号和一个常规索引符号。切片符号表示沿第一个维度的所有索引(由于数组有两行,因此分别为0和1),而4表示沿第二个维度的第五个元素。正则索引的每个实例基本上都会将返回对象的维数减一,因此,由于它X是一个2D数组,并且有一个正则索引,因此得到一维结果。Numpy只是将一维数组显示为行向量。如果想获得与开始时相同的尺寸,那么诀窍就是使用所有切片索引,就像我在本文顶部示例中所做的那样。
X[:,4]
X
如果要提取总列数超过5的东西的第五列,则可以使用X[:,4:5]。如果要查看第3-4行和第5-7列,则可以执行X[3:5,5:8]。希望你能明白。
X[:,4:5]
X[3:5,5:8]