繁体   English   中英

索引/切片numpy数组的混乱

[英]A confusion of indexing/slicing a numpy array

通过numpy数组切片时,我需要澄清。

假设我想对数组进行切片,使索引从较高的值开始递减到第一个索引。 例如,a = np.zeros(10)

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

附带说明一下,如何获得两个不相交的切片的并集?

谢谢

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

附带说明一下,如何获得两个不相交的切片的并集?

itertools.chain()

要使用最后一个索引-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的正方向步进比从-15的负方向步进更有意义。 两者都只有通过将-1解释为n-1才有意义。

关于反向步进的本质上令人困惑的是Python策略,即在a[start:end]中不包含end元素。 通常,这可以使索引更整洁,但是这里必须明确处理此问题,因为终点(并已排除)现在是起点(并已包括在内)。 也就是说, a[5:-1:-1]a[-1:5:-1]并非相反。

考虑到我想尽可能少地考虑这些端点问题,通常我会做上面上面作为不那么令人困惑的选择的事情。

(以上所有引号均来自此处 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM