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

时间:2015-06-30 18:11:41

标签: python numpy slice

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

  

假设 n 是要切片的维度中的元素数量。然后,如果没有给出 i ,则对于 k&gt;默认为0。 0 n - 1 k&lt; 0 的。如果未给出 j ,则默认为 n k <> 0 -1, k&lt; 0 即可。如果未给出 k ,则默认为1.

然而:

>>> 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],但

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

,而

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

k&lt; 时, j 的默认值< 0 应为 - (n + 1)。根据{{​​3}},我相信&#34;官方&#34;当 k <时,默认值为 j 0 None

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

1 个答案:

答案 0 :(得分:4)

在第一级处理时,Python解释器将::表示法转换为slice对象。由numpy.__getitem__方法解释这3个数字。

[::-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)[slice(5,0,-1)]    Out [285]:array([5,4,3,2,1])

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

那你如何包括0

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

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

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

None以特殊方式解释,允许我们使用:

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

这也有效(10-11=-1 - 真正的-1

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

因此,-1表示before 0-1表示count from n。文档可以清楚地说明这一点,但它没有错(如果使用正确的-1)。