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

时间:2013-03-26 00:31:18

标签: python numpy scipy

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

x[i:j]让我了解范围x的{​​{1}}。 我喜欢我也可以[i,j)排除最后x[i:-k]元素。

但是,为了包含我需要做的最后一个元素k

我的问题是:如果我需要循环x[i:],如何组合这两种符号。

说我想这样做:

k

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

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

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

先谢谢。

4 个答案:

答案 0 :(得分:10)

这有点痛苦,但由于-00相同,因此没有简单的解决方案。

一种方法是:

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

这是因为当k为0时,-k or NoneNone,而x[:None]会执行您想要的操作。对于k的其他值,-k or None将为-k

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

答案 1 :(得分:8)

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

你可以做旧学校:

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

答案 2 :(得分:4)

切片中的值None与放置任何内容的值相同。换句话说,x[:None]x[:]相同。所以:

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

然而......这段代码作为列表理解更容易编写:

l = [x[:k] for k in (-5,-4,-3,-2,-1,None)]

或者......你可能想要看看你想做什么,看看是否有更高层次的抽象是有道理的,或者可能只是另一种组织更具可读性的东西(即使它有点像更详细)。例如,根据x实际代表的内容,这可能更容易理解(或者当然可能更少):

l = []
for k in range(6):
    l.insert(0, x)
    x = x[:-1]

答案 3 :(得分:0)

也许这就是:

l = list()
for k in [5,4,3,2,1,None]:
    l.append(x[:-k if k else None])

如果x只是range(10),则上述代码将生成:

[[0, 1, 2, 3, 4],
 [0, 1, 2, 3, 4, 5],
 [0, 1, 2, 3, 4, 5, 6],
 [0, 1, 2, 3, 4, 5, 6, 7],
 [0, 1, 2, 3, 4, 5, 6, 7, 8],
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]