在Numpy / Scipy中切片数组
我有一个数组,长得像这样:
a = array([[1,2,3],[3,4,5],[4,5,6]])
请问,有什么最有效的方法可以从中切出一个1行2列的数组,只包含“a”的前两列呢?
也就是说:
array([[2,3],[4,5],[5,6]]) in this case.
3 个回答
根据文档,基本的切片语法是i:j:k
,其中i
是起始索引,j
是结束索引,k
是步长(当k > 0
时)。
如果没有给出i
,当k > 0
时,默认从0开始。否则,当k < 0
时,i
默认是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]
的意思是:给我每隔一行的行,从最上面开始,并且只给我第2列。
这让我花了一些时间才弄明白。所以把它贴在这里,希望能帮到某个人。
这就是你想要的东西吗?
a[:,1:]
二维的numpy数组是用 a[i,j]
这种方式来索引的(而不是 a[i][j]
),不过你可以像使用普通的矩阵那样,用相同的切片方式来处理numpy数组和矩阵,只需要把它们放在一个 []
中就可以了:
>>> from numpy import array >>> a = array([[1,2,3],[3,4,5],[4,5,6]]) >>> a[:,1:] array([[2, 3], [4, 5], [5, 6]])