我在切片范围中使用什么值来包含numpy数组中的最后一个值?

Jul*_*ius 11 python numpy scipy

想象一下一些numpy数组,例如x = np.linspace(1,10).

x[i:j]让我了解x范围[i,j).我喜欢我也可以这样做x[i:-k],排除了最后的k元素.

但是,为了包含我需要做的最后一个元素x[i:].

我的问题是:如果我需要循环,我如何组合这两个符号k.

说我想这样做:

l = list()
for k in [5,4,3,2,1]:
    l.append(x[:-k])
l.append(x[:])
Run Code Online (Sandbox Code Playgroud)

令我恼火的是最后一行.在这个简单的例子当然,它没有太大的区别,但有时这会变得更加烦人.我想念的是更像DRY的东西.

以下代码段不会产生预期的结果,但代表了我寻求的代码样式:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:-k])
Run Code Online (Sandbox Code Playgroud)

谢谢你的支持.

Alo*_*hal 12

这是一个有点痛,但因为-0是一样的0,没有简单的解决方案.

一种方法是:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:-k or None])
Run Code Online (Sandbox Code Playgroud)

这是因为当它k是0时,-k or NoneNone,并且x[:None]会做你想要的.对于其他值k,-k or None将是-k.

我不确定自己是否喜欢它.


Ant*_*ano 8

你不能,因为-0不会在python中切片(它变为0)

你可以做旧学校:

l = list()
for k in [5,4,3,2,1,0]:
    l.append(x[:len(x)-k])
Run Code Online (Sandbox Code Playgroud)


aba*_*ert 5

None切片中的 value与什么都不放在那里相同。换句话说,x[:None]与 相同x[:]。所以:

l = list()
for k in [-5,-4,-3,-2,-1,None]:
    l.append(x[:k])
Run Code Online (Sandbox Code Playgroud)

然而……这段代码写成列表推导式要容易得多:

l = [x[:k] for k in (-5,-4,-3,-2,-1,None)]
Run Code Online (Sandbox Code Playgroud)

或者……您可能想查看您正在尝试做的任何事情,看看是否有更有意义的更高级别的抽象,或者可能只是另一种更易读的组织方式(即使它有点冗长) . 例如,根据x实际代表的内容,这可能更容易理解(当然,也可能更容易理解):

l = []
for k in range(6):
    l.insert(0, x)
    x = x[:-1]
Run Code Online (Sandbox Code Playgroud)