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