[英]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,因此您会得到一个空列表。
附带说明一下,如何获得两个不相交的切片的并集?
要使用最后一个索引-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策略,即在a[start:end]
中不包含end
元素。 通常,这可以使索引更整洁,但是这里必须明确处理此问题,因为终点(并已排除)现在是起点(并已包括在内)。 也就是说, a[5:-1:-1]
与a[-1:5:-1]
并非相反。
考虑到我想尽可能少地考虑这些端点问题,通常我会做上面上面作为不那么令人困惑的选择的事情。
(以上所有引号均来自此处 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.