【问题标题】:Python numpy array negative indexingPython numpy 数组负索引
【发布时间】:2019-06-02 07:08:11
【问题描述】:

我对 numpy 的索引有点困惑。假设以下示例:

>>> import numpy as np
>>> x = np.arange(10)
>>> x.shape = (2,5)
>>> x
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> x[0:-1]
array([[0, 1, 2, 3, 4]])
>>> x[1:-1]
array([], shape=(0, 5), dtype=int64)
>>> x[1:]
array([[5, 6, 7, 8, 9]])

我感到困惑的是,我可以使用x[0:-1] 将第一行作为二维数组。但就索引而言,-1 实际上意味着什么?我原以为,调用x[1:-1] 会给我第二行,但如果返回一个空数组,并得到我想要的,我需要使用 x[1:]?

我有点困惑。 感谢您的帮助

【问题讨论】:

  • [1:-1]:从第二个(项目/行)到最后一个(=第二个)项目/行:这将导致一个空数组。
  • 首先尝试使用包含两个元素的简单 Python 列表:x = [1, 2],然后以相同的方式对其进行索引:看看你得到了什么。在你的情况下,数字 12 被长度为 5 的数组替换。

标签: python python-3.x numpy scipy numpy-ndarray


【解决方案1】:

你有这样的声明:

In [31]: x[0:-1]

这种索引方式意味着“从第一行开始,直到最后一行(排除)”。这就是我们得到第一行结果的原因。

Out[31]: array([[0, 1, 2, 3, 4]])

但是,当你这样做时:

 In [31]: x[1:-1]   
 Out[31]: array([], shape=(0, 5), dtype=int64)

它要求 NumPy “从第二行开始,不包括最后一行”。由于这里第二行也是最后一行,所以排除了它,结果我们得到一个空数组。


更多信息:这里没有关于使用负索引(例如 -1)的具体说明。例如,以下索引方式也会返回空数组。

# asking to "start at first row and end at first row"
In [42]: x[0:0]  
Out[42]: array([], shape=(0, 5), dtype=int64)

# asking to "start at second row and end at second row"
In [43]: x[1:1]  
Out[43]: array([], shape=(0, 5), dtype=int64)

当涉及到 Python/NumPy 中的索引时,它始终是“left inclusive and right exclusive”。

这是纯 Python 中的一些内容(即索引 list

In [52]: lst = [1, 2] 

In [53]: lst[1:-1]    
Out[53]: []   # an empty list

请注意索引的构造是:[start:stop:step]

如果我们 startstop 在同一个索引处,那么我们将无处可去,结果会返回一个空数据结构(数组/列表/元组等) .

【讨论】:

    【解决方案2】:

    如果您请求切片 x[a:b],您将收到从 a 到但不包括 b 的部分。因此,如果您对x[1:-1] 进行切片,则结果数组将不包含-1,这恰好与(2,5) 数组中的1 相同。另一个例子:

    >>> import numpy as np
    >>> x = np.arange(15)
    >>> x.shape = (3,5)
    >>> x
    array([[0,  1,  2,  3,  4],
           [5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    >>> x[0:-1]
    array([[0, 1, 2, 3, 4]])
    >>> x[1:-1]
    array([[5, 6, 7, 8, 9]])
    

    上面的最后一个操作将x 从行1 切分到(不包括)最后一行,即行1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2012-07-14
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多