关于python:(i:j:k)numpy切片中j的默认值是多少?

What is the default value of j in (i:j:k) numpy slicing?

我一直在scipy.org上阅读numpy i:j:k切片的教程。在第二个例子之后,它说

Assume n is the number of elements in the dimension being sliced. Then, if i is not given it defaults to 0 for k > 0 and n - 1 for k < 0. If j is not given it defaults to n for k > 0 and -1 for k < 0. If k is not given it defaults to 1.

然而:

1
2
3
4
>>> import numpy as np
>>> x = np.array([0,1,2,3,4])
>>> x[::-1]
array([4, 3, 2, 1, 0])

如果j默认为-1,那么x[:-1:-1]应等于x[::-1],但是

1
2
3
4
>>> x[:-1:-1]
array([], dtype=int64)
>>> x[:-(len(x)+1):-1]
array([4, 3, 2, 1, 0])

虽然

1
2
>>> x[:-(len(x)+1):-1]
array([4, 3, 2, 1, 0])

因此,当k<0时,j的默认值应该是-(n+1)。根据StackOverflow上的这篇文章,我认为k<0时j的"官方"默认值是None

我是否误解了scipy.org的教程?


在第一级处理中,python解释器将::符号转换为slice对象。这三个数字的解释取决于numpy.__getitem__方法。

[::-1]slice(None,None,-1)相同。

如你所说,x[slice(None,None,-1)]x[slice(None,-1,-1)]不同。

我怀疑-1在:

If j is not given it defaults to n for k > 0 and -1 for k < 0 .

不是故意这样的。相反,它的通常含义是-1,the number before 0

在[285]中:np.arange(10)[切片(5,0,-1)]out[285]:数组([5,4,3,2,1])

j解释为iterate upto, but not including, this value,迭代方向由k确定。因此,0值不包含在该切片中。

那么,您如何包括0

1
2
In [287]: np.arange(10)[slice(5,-1,-1)]
Out[287]: array([], dtype=int32)

不起作用,因为-1被理解为n-1,如:

1
2
In [289]: np.arange(10)[slice(5,-7,-1)]
Out[289]: array([5, 4])

None以一种特殊的方式解释,我们可以使用:

1
2
In [286]: np.arange(10)[slice(5,None,-1)]
Out[286]: array([5, 4, 3, 2, 1, 0])

这同样有效(10-11=-1—真实的-1)

1
2
In [291]: np.arange(10)[slice(5,-11,-1)]
Out[291]: array([5, 4, 3, 2, 1, 0])

因此,在-1-1之间有一个区别,这意味着before 0,和-1,这意味着count from n。文档可能对此很清楚,但它没有错(如果使用正确的-1)。