在Numpy / Scipy中切片数组

20 投票
3 回答
28997 浏览
提问于 2025-04-15 22:05

我有一个数组,长得像这样:

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 个回答

5

根据文档,基本的切片语法是i:j:k,其中i是起始索引,j是结束索引,k是步长(当k > 0时)。

如果没有给出i,当k > 0时,默认从0开始。否则,当k < 0时,i默认是n - 1n是数组的长度)。

如果没有给出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列。

这让我花了一些时间才弄明白。所以把它贴在这里,希望能帮到某个人。

6

这就是你想要的东西吗?

a[:,1:]
28

二维的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]])

撰写回答