Xia*_*gyu 6 python numpy slice
我一直在阅读scumpy.org上的numpy i:j:k切片教程.在第二个例子后,它说
假设n是要切片的维度中的元素数.然后,如果我没有给出其默认值为0 K> 0和N - 1为ķ<0 .如果没有给出j,则对于k> 0,默认为n ; 对于k <0,默认为-1.如果没有给出k,则默认为1.
然而:
>>> import numpy as np
>>> x = np.array([0,1,2,3,4])
>>> x[::-1]
array([4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)
如果j默认为-1,那么x[:-1:-1]应该相当于x[::-1],但是
>>> x[:-1:-1]
array([], dtype=int64)
>>> x[:-(len(x)+1):-1]
array([4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)
而
>>> x[:-(len(x)+1):-1]
array([4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)
因此当k <0时,j的默认值应为- (n + 1).根据stackoverflow上的这篇文章,我相信当k <0时,j的"官方"默认值是.None
我是否在SciPy.org上误解了教程?
在第一级处理中,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。
In [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)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为 被-1理解为n-1,如:
In [289]: np.arange(10)[slice(5,-7,-1)]
Out[289]: array([5, 4])
Run Code Online (Sandbox Code Playgroud)
None以一种特殊的方式解释,让我们可以使用:
In [286]: np.arange(10)[slice(5,None,-1)]
Out[286]: array([5, 4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)
这也有效(10-11=-1-真实的-1)
In [291]: np.arange(10)[slice(5,-11,-1)]
Out[291]: array([5, 4, 3, 2, 1, 0])
Run Code Online (Sandbox Code Playgroud)
-1因此, “thatmeans”before 0和-1“thatmeans”之间是有区别的count from n。文档对此可能很清楚,但这并没有错(如果您使用正确的 -1)。