我在澄清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作为索引有什么问题?
另外,如何获得两个不相交切片的并集?
谢谢
答案 0 :(得分:4)
在Python中,按照惯例,索引-1指的是数组的最后一个元素。 -2是倒数第二个,依此类推。当您从5切换到-1时,对于长度为10的数组,这相当于切片[5:9]
。当您添加-1
步时,您会说“切片向下从5到9“但这是荒谬的,因为5低于9,所以你得到一个空列表。
另外,如何获得两个不相交切片的并集?
答案 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)。