(i:j:k) numpy 切片中 j 的默认值是多少?
What is the default value of j in (i:j:k) numpy slicing?
我一直在阅读 i:j:k 切片的教程 Scipy.org。在第二个例子之后,它说
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.
但是:
>>> 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 < 0时j的默认值应该是-(n+1)。根据 this post on Whosebug,我相信当 k < 0 时 j 的 "official" 默认值是 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
.
的通常含义
在[285]中:np.arange(10)[切片(5,0,-1)]
输出 [285]: 数组([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)。
我一直在阅读 i:j:k 切片的教程 Scipy.org。在第二个例子之后,它说
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.
但是:
>>> 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 < 0时j的默认值应该是-(n+1)。根据 this post on Whosebug,我相信当 k < 0 时 j 的 "official" 默认值是 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
.
在[285]中:np.arange(10)[切片(5,0,-1)] 输出 [285]: 数组([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)。