Numpy / Scipy中的切片数组

u91tlkcl  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(194)

我有一个数组:

a = array([[1,2,3],[3,4,5],[4,5,6]])

从这个只有前两列“a”的数组中切出一个1x2数组的最有效方法是什么?
也就是说

array([[2,3],[4,5],[5,6]]) in this case.
ve7v8dk2

ve7v8dk21#

二维numpy数组使用a[i,j](而不是a[i][j])进行索引,但是你可以对numpy数组和矩阵使用与Python中普通矩阵相同的切片表示法(只需将它们放在一个[]中):

>>> from numpy import array
>>> a = array([[1,2,3],[3,4,5],[4,5,6]])
>>> a[:,1:]
array([[2, 3],
       [4, 5],
       [5, 6]])
n3ipq98p

n3ipq98p2#

这就是你要找的吗?

a[:,1:]
jogvjijk

jogvjijk3#

引用documentation,基本片语法是i:j:k,其中i是起始索引,j是停止索引,并且k是步长(当k > 0时)。
现在,如果没有给定i,则k > 0默认为0。否则,k < 0i默认为n - 1(其中n是数组的长度)。
如果未指定j,则默认为n(数组长度)。
这是针对一维数组的。
现在,二维数组是一种不同的东西,它的切片语法是a[rowrange, columnrange]
因此,如果您需要所有行,但只需要最后两列,就像您的示例一样,您可以:

a[0:3, 1:3]

这里,“[0:3]“表示从0到3的所有行,而“[1:3]“表示从列1到列3的所有列。
现在,您可能想知道,即使只有3列并且编号从1开始,它也必须正确返回3列,即:第1栏、第2栏、第3栏
这是这个语法的难点。第一列实际上是第0列。所以当你说“[1:3]“时,你实际上是在说给予我第1列和第2列。这是你想要的最后两列。(实际上没有第3列。)
现在,如果你不知道你的矩阵有多长,或者你想要所有的行,你可以把那部分留空。

a[:, 1:3]

列也是如此。例如,如果你想除第一行外的所有列,你可以写

a[0:1,:]

现在,上面的答案a[:,1:]是如何工作的,因为当你说“[1:]“的列,它的意思是给予我一切除了列0,直到所有列的结束。即空的意思是'直到结束'。
到现在为止,您必须认识到,逗号两边的任何内容都是我在上面第一次提到的一维情况的子集。即,如果您希望使用步长指定行,您可以编写

a[::2,1]

在你的情况下

array([[2, 3],
       [5, 6]])

a[::2,1]解释为:每隔一行,从最上面开始,只给我第二列。
这花了我一些时间才弄明白。所以把它贴在这里,以防万一它对某人有帮助。

相关问题