Numpy数组文档切片规则

时间:2016-01-29 06:33:10

标签: python numpy

在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 , :: , ::]不一样吗?

2 个答案:

答案 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])