了解NumPy数组的切片

时间:2019-07-18 13:40:22

标签: python numpy slice

我不了解以下程序的输出:

import numpy as np

myList = [[1,   2,  3,  4],
          [5,   6,  7,  8],
          [9,  10, 11, 12],
          [13, 14, 15, 16]]

myNumpyArray = np.array(myList)

print(myNumpyArray[0:3, 1:3])

输出

[[ 2  3]
 [ 6  7]
 [10 11]]

我知道这将是所有行和第二至第四列的交集。按照这种逻辑,输出应为:

 2   3  4
 6   7  8
10  11 12
14  15 16

我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

结尾索引(0:31:3中的3是排他的,而不是包含端点的,而起始索引(01)实际上是包含端点的。如果结尾索引包含在内,则输出将与您期望的一样。但是,由于它们是排他性的,因此您实际上只抓取行0、1和2,以及列1和2。输出是它们的交集,等效于您看到的输出。

如果您要获取期望的数据,则可以执行myNumpyArray[:, 1:]:只是获取了数组的所有元素(在您的情况下,是在数组的第一维),而1:则获取了从索引1开始的数组的所有内容,而忽略了数据在第0位。

答案 1 :(得分:0)

这是仅需要了解切片符号的经典情况。

在括号内,您具有每个尺寸的切片:

arr[dim1_start:dim1_end, dim2_start, dim2_end]

对于上述表示法,分片将包含从dimX_start开始,直至但不包括dimX_end的元素。

所以,对于您写的内容:myNumpyArray[0:3, 1:3]

您选择了0, 1, and 2 (not including 3)行和1 and 2 (not including 3)


我希望这有助于解释您的结果。


要获得预期的结果,您将需要更多类似的东西:

print(myNumpyArray[0:4, 1:4])

有关切片的更多信息,您可以转到numpy docs或查看前一阵子发布的a similar question