Python numpy数组负索引

10

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

10

您有以下陈述:

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中的索引时,它总是“左闭右开”的。

这是一个在纯Python(即索引一个list)中的例子:

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

In [53]: lst[1:-1]    
Out[53]: []   # an empty list
请注意索引的构造方式,即:[start:stop:step] 如果我们在相同的索引处设置 start 和 stop ,则无法获取数据,并且将返回一个空的数据结构(数组/列表/元组等)。

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],
       [5, 6, 7, 8, 9]])
>>> x[1:-1]
array([[5, 6, 7, 8, 9]])

上面的最后一个操作从第1行开始(不包括第1行),对x进行了切片,这个切片的范围是到最后一行,也就是只有一行1

1
x[0:-1] 的输出结果为: array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) - mhc
你是对的,我现在已经纠正了这个问题。 - MPA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接