为什么 a[1:-1:-1] 和 a=[1,2,3] 返回 []?

称呼

我观察到 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看起来像是一种令人讨厌的不一致。显然,有一些解决方法:

  1. 可以通过数组长度编写a[i+m-1-n:i-1-n:-1]偏移所有内容;或者-nn
  2. 一个可以写a[i:i+m][::-1]

但是,在情况 1 中,知道数组长度的需要显得相当不自然,而在情况 2 中,如果切片是在紧密循环中完成的,则双索引似乎不是非常合理的开销。

  • 是否有任何重要的原因让我想念我的行为是很重要的?

  • NumPy 社区是否考虑过这个问题?

  • 有比我想出的更好的解决方法吗?

客人

Numpy 已经从 Python 的序列索引中采用了这种行为,这里解释了规则。具体脚注 (5) 内容如下:

sfrom ito jwith step的切片k被定义为具有索引的项目序列,x = i + n*k使得0 <= n < (j-i)/k. 换句话说,索引是ii+k、等i+2*k,在达到i+3*k时停止j(但从不包括j)。何时k为正,如果它们更大ij则归结为。len(s)Whenk是负数,如果它们更大ij则归结为。len(s) - 1如果iorj被省略 or None,它们将成为“结束”值(结束取决于 的符号k)。注意,k不能为零。如果k为 None,则将其视为1

所以指数是从乘数生成n0 <= n < (j-i)/k对于您的具体示例(j-i)/k < 0,因此不计算索引。

对于 Numpy 数组a[i:i+m][::-1]生成底层数组的视图,即它的开销可以忽略不计,因此似乎是一个有效的解决方案。它清楚地传达了意图,即“从某个通用索引开始相反的顺序获取数组的子数组aii+m” 。

或者,如果为零,您可以None用作停止参数:i

a[i+m-1:(None if i==0 else i-1):-1]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么`“%,2,%”之类的“,1,2,3,”`返回零?

为什么Julia>(1,2,3)返回(1,2,0)

在Excel公式中“ A1:A4 ^ {1,2,3}”是什么意思?

为什么两种情况下的行为不同1。int i = 1,2,3; 和第二。我 i = 1,2,3;

std :: initializer_list <int>({1,2,3})和{1,2,3}有什么区别?

tf.constant([1,2,3])和tf.constant([[1,2,3]])有什么区别

为什么 a = [1,2,3] 和 a[:] 不一样

为什么null不in(1,2,3)为false

为什么findLastCompletelyVisibleItemPosition()返回-1?

为什么 DATEDIFF 返回 -1

为什么乘积[]返回1?

为什么〜0返回-1?

为什么x in(1,2,3):比x == 1或x == 2或x == 3快?

对于np.array([1,2,3]),为什么形状是(3,)而不是(3,1)?

为什么1 == 1 == 1返回true,“ 1” ==“ 1” ==“ 1”返回true,而“ a” ==“ a” ==“ a”返回false?

Python:(1,2,3)和[1,2,3]有什么区别,什么时候应该使用它们?

为什么此代码返回0和1?

为什么布尔表达式“(1,2,3)== True中的1”为False?

为什么1 && 2返回2?

为什么 id([1][::-1]) ==id([1]) 返回 True 而 [1][::-1] 是 [1] 返回 False?

为什么返回3,1?

为什么 '1' + '1' = 98 和 '1' + 1 = 50?

为什么是 1 + 1 ?1 : 0 + 1 返回 1 而不是 3?

为什么len([1,[2,[3]]]])返回2,而len([1,[2]])也返回2?

为什么3> 2> 1返回false,而1 <2 <3返回true?

pow(sqrt(-1),2)为什么不返回-1?

Ruby中[1,2,3] .to_enum和[1,2,3] .enum_for之间的差异

为什么在JavaScript中(([[] === [])+ /-/)[1] ='a'和(1 + {})[(1 << 1)+1] ='b'是为什么?

将1,2,3分为个人1、2和3