在numpy数组切片中如何包括最后一个值?

19 投票
4 回答
15229 浏览
提问于 2025-04-17 20:17

想象一下有一个numpy数组,比如说 x = np.linspace(1,10)

x[i:j] 这个写法可以让我查看 x 中从 ij 之间的部分,注意这里的 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[:])

让我感到烦恼的是最后那一行。在这个简单的例子中,当然没什么大不了的,但有时候这样会变得很麻烦。我希望能有一种更简洁的写法。

下面这段代码虽然不能得到想要的结果,但它代表了我想要的代码风格:

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

4 个回答

6

在切片中,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]
11

你不能这样做,因为在Python中,-0不会那样切片(它会变成0)。

你可以试试老办法:

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

这有点麻烦,因为 -00 是一样的,所以没有简单的解决办法。

一种可行的方法是:

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

这是因为当 k 为 0 时,-k 或 None 的结果是 None,而 x[:None] 会按照你想要的方式工作。对于其他的 k 值,-k 或 None 的结果就是 -k

不过我自己也不太确定我喜欢这个方法。

撰写回答