【问题标题】:Understanding the slicing of NumPy array理解 NumPy 数组的切片
【发布时间】:2019-11-27 11:19:29
【问题描述】:

下面程序的输出我没看懂:

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 到第 4 列的交集。在那个逻辑中,输出应该是:

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

我在这里错过了什么?

【问题讨论】:

  • 0:3 表示选择从03-1=2 的所有行,1:3 表示选择从13-1=2 的所有列。您需要关心未包含的最后一个值。这个doc 可能会对你有所帮助

标签: python numpy slice


【解决方案1】:

结束索引(0:31:3 中的 3)是排他性的,不包含在内,而起始索引(01)实际上是包含性的。如果结束索引是包容性的,那么输出将如您所料。但是因为它们是独占的,所以您实际上只抓取了第 0、1 和 2 行以及第 1 和第 2 列。输出是它们的交集,相当于您看到的输出。

如果您想获取您期望的数据,您可以使用myNumpyArray[:, 1:]: 只是抓取数组的所有元素(在你的情况下,在数组的第一维),1: 从索引 1 开始抓取数组的所有内容,忽略第 0 位的数据.

【讨论】:

    【解决方案2】:

    这是一个只需要理解切片符号的经典案例。

    在括号内,每个维度都有切片:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多