我观察到 ifa
是一个包含元素的列表(或一个 numpy 数组)[1,2,3]
并且我要求a[1:-1:-1]
,然后我得到空列表。我希望[2,1]
假设切片跨越从 1 到 -1 递减的可获取索引,不包括最后一个值(即不包括 -1),即索引 1 和 0。
实际行为可能有一些理由,但是当需要a
从某个通用索引开始以相反的顺序i
索引(排除)的数组的子数组时,会使事情比预期的更复杂。i+m
有人会倾向于写a[i+m-1:i-1:-1]
,但如果设置为 0,这会突然中断。它对除零i
以外的所有人都有效,这一事实i
看起来像是一种令人讨厌的不一致。显然,有一些解决方法:
a[i+m-1-n:i-1-n:-1]
偏移所有内容;或者-n
n
a[i:i+m][::-1]
。但是,在情况 1 中,知道数组长度的需要显得相当不自然,而在情况 2 中,如果切片是在紧密循环中完成的,则双索引似乎不是非常合理的开销。
是否有任何重要的原因让我想念我的行为是很重要的?
NumPy 社区是否考虑过这个问题?
有比我想出的更好的解决方法吗?
Numpy 已经从 Python 的序列索引中采用了这种行为,这里解释了规则。具体脚注 (5) 内容如下:
s
fromi
toj
with step的切片k
被定义为具有索引的项目序列,x = i + n*k
使得0 <= n < (j-i)/k
. 换句话说,索引是i
、i+k
、等i+2*k
,在达到i+3*k
时停止j
(但从不包括j
)。何时k
为正,如果它们更大i
,j
则归结为。len(s)
Whenk
是负数,如果它们更大i
,j
则归结为。len(s) - 1
如果i
orj
被省略 orNone
,它们将成为“结束”值(结束取决于 的符号k
)。注意,k
不能为零。如果k
为 None,则将其视为1
。
所以指数是从乘数生成n
的0 <= n < (j-i)/k
。对于您的具体示例(j-i)/k < 0
,因此不计算索引。
对于 Numpy 数组a[i:i+m][::-1]
生成底层数组的视图,即它的开销可以忽略不计,因此似乎是一个有效的解决方案。它清楚地传达了意图,即“从某个通用索引开始以相反的顺序获取数组的子数组a
i
i+m
” 。
或者,如果为零,您可以None
用作停止参数:i
a[i+m-1:(None if i==0 else i-1):-1]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句