在numpy数组http://docs.scipy.org/doc/numpy-1.5.x/reference/arrays.indexing.html#basic-slicing的基本切片中,
我发现以下规则不适用于我在下面显示的示例。
规则:假设n是维度中元素的数量 切片。然后,如果没有给出i,则对于k> 0,默认为0。 k为0,n为n &LT; 0。如果没有给出j,则对于k> 0,默认为n。 0和-1表示k < 0。 如果没有给出k,则默认为1.注意::与:和。相同 表示沿此轴选择所有索引。
我的理解:这可以优先考虑从上到下:
a)如果没有给出k,则默认为1.
b)如果没有给出j,则默认为 n为k> 0和-1表示k < 0。
c)如果没有给出,则默认为0 对于k> 0和n表示k < 0
现在让我们看看这个例子。基本上我正在做的是采取一个3d数组并从下往上打印。具有最大索引的层首先出现,然后是较小的层。请查看代码以便更好地理解。
import numpy as np
b= np.arange(24).reshape(2,3,4)
print "Here is the input :"
print b
print
print "Here is what is desired output :"
print b[::-1 , :: ,::]
print
print "Here is what I want to get desired output by a different way using above rule :"
print b[2:-1:-1 , :: , ::]
输出:
Here is the input :
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
Here is what is desired output :
[[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]]
Here is what I want to get desired output by a different way using above rule :
[]
上述规则b[::-1 , :: ,::]
与b[2:-1:-1 , :: , ::]
不一样吗?
答案 0 :(得分:2)
该文档是正确的,但它并不意味着您可以再次使用slice
对象中计算的开始,结束索引。它只告诉你计算开始和时间的逻辑。结束指数。要使用计算的索引,您需要按range()
:
以下是一个例子:
import numpy as np
s = slice(None, None, -1)
t = np.array([1, 2, 3, 4])
s.indices(len(t))
输出:
(3, -1, -1)
所以[::-1]
对于四元素数组的(开始,停止,步幅)是(3,-1,-1),但是t[3:-1:-1]
是空的。 (开始,停止,跨步)适用于range()
,因此,您可以使用t[range(3,-1,-1)]
[4, 3, 2, 1]
。
答案 1 :(得分:1)
如果采取否定步骤,您需要对启动和停止值进行三思考。
一个简单的反转:
In [437]: np.arange(10)[::-1]
Out[437]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
从最后开始 - 同样的事情
In [438]: np.arange(10)[10::-1]
Out[438]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
-1停止,空
In [439]: np.arange(10)[10:-1:-1]
Out[439]: array([], dtype=int32)
但是-2,它返回最后一个值;记住它从最后算起,而-2也从最后算起。
In [440]: np.arange(10)[10:-2:-1]
Out[440]: array([9])
最后4项:
In [441]: np.arange(10)[10:-5:-1]
Out[441]: array([9, 8, 7, 6])
除了第一个之外的所有人:
In [442]: np.arange(10)[10:-10:-1]
Out[442]: array([9, 8, 7, 6, 5, 4, 3, 2, 1])
与0相同:
In [445]: np.arange(10)[10:0:-1]
Out[445]: array([9, 8, 7, 6, 5, 4, 3, 2, 1])
你必须使用None来获取所有东西:
In [446]: np.arange(10)[10:None:-1]
Out[446]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])