在numpy数组切片中如何包括最后一个值?
想象一下有一个numpy数组,比如说 x = np.linspace(1,10)
。
x[i:j]
这个写法可以让我查看 x
中从 i
到 j
之间的部分,注意这里的 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
这有点麻烦,因为 -0
和 0
是一样的,所以没有简单的解决办法。
一种可行的方法是:
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
。
不过我自己也不太确定我喜欢这个方法。