索引/切片numpy数组的混乱

时间:2015-05-04 15:22:56

标签: python numpy

我在澄清numpy数组时做了澄清。

假设我想切片一个数组,索引从一些较高的值倒数到第一个索引。例如,a = np.zeros(10)

如果我做[5 :: - 1],我得到数组([0.,0.,0.,0.,0.,0。]),但为什么当我做[5: - 1:-1],我得到以下数组([],dtype = float64)。我不理解它背后的逻辑。对我来说,指定最后一个索引很重要。另一方面,如果我想要这个数组的前5个条目,[0:5:1]和[:5:1]都给我相同的结果。使用-1作为索引有什么问题?

另外,如何获得两个不相交切片的并集?

谢谢

2 个答案:

答案 0 :(得分:4)

在Python中,按照惯例,索引-1指的是数组的最后一个元素。 -2是倒数第二个,依此类推。当您从5切换到-1时,对于长度为10的数组,这相当于切片[5:9]。当您添加-1步时,您会说“切片向下从5到9“但这是荒谬的,因为5低于9,所以你得到一个空列表。

  

另外,如何获得两个不相交切片的并集?

itertools.chain()

答案 1 :(得分:1)

要使用最后一个索引-1向后切片,您需要的起始索引大于而不是停止索引,所以:

import numpy as np
a = 10+np.arange(10)

print a[-1:5:-1]   # [19 18 17 16]
print a[6:][::-1]  # [19 18 17 16]  A less confusing alternative

这有什么意义:

首先,消极的步骤总是意味着“走向更小的指数”。因此,要列出具有负步骤的数组,第一个索引必须大于最后一个索引。当使用负指数时,这会有点混乱,但在这里,与其他地方一样,必须将消极步骤视为“解释为n+step”。毕竟,从5-1踩正方向,没有比从-1走向5的消极方向更有意义了。只有-1被解释为n-1

的理解才有意义

反向步进本质上令人困惑的是Python政策不包括end中的a[start:end]元素。通常,这允许更清晰的索引,但是这里必须明确地处理这个问题,因为终点(并且被排除)现在是起点(并且包括在内)。也就是说,a[5:-1:-1]不是a[-1:5:-1]的反面。

鉴于我想尽可能少地考虑这些端点问题,我通常只是做上面那些不那么令人困惑的选项。

(以上所有引用均来自here)。