在numpy中以相反的顺序索引索引0

时间:2017-06-26 17:11:07

标签: python python-2.7 numpy

我创建了一个矩阵a,我试图以相反的顺序对其进行索引。这些是我的输出:

>>> a

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31],
       [32, 33, 34, 35],
       [36, 37, 38, 39],
       [40, 41, 42, 43],
       [44, 45, 46, 47]])

>>> print a[2:0:-1]
[[ 8  9 10 11]
 [ 4  5  6  7]]

正如你所看到的,我没有得到第一行。现在,当我尝试这个时,我得到一个空箭头输出,因为它将它视为2 .. n - 1。

>>> print a[2:-1:-1]
[]

我想知道是否有反向迭代,包括在numpy中使用索引符号的第0个索引?

我想在一般意义上这样做,所以当我像这样迭代一些数组时,我可以利用这个:

>>> b = []
>>> for i in range(a.shape[0] - 3):
...     b.append(np.hstack(a[i+3:i:-1]))

显示问题的额外说明:

现在,如果我将其修改为:

>>> b = []
>>> for i in range(a.shape[0] - 3):
...     b.append(np.hstack(a[i+2:i-1:-1]))

以上只会输出错误。因为,在第一次迭代中,它将是[2:-1:-1],它将是一个空数组。

第一种形式只是生成错误的输出,因为它将被解释为[3,0],而第二种形式将被解释为[2,n-1],这是完全错误的。

我使用的是python 2.7,但它也可能与python 3相关。

2 个答案:

答案 0 :(得分:4)

请注意,切片永远不会在停止索引[start, stop)处包含该项,因此第0项将从切片中排除。

要一直切到开头,请不要指定停止索引(索引传递为None):

>>> a[2::-1]
array([[ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3]])

指定 stop -1会返回一个空切片,因为-1表示最后一项;一个人不能(在一个有用的意义上)从索引2到最后一个项目跨越

对于您的用例,您可以在切片中使用表达式,如短路:

...
a[2:(i or None):-1] # 0 is falsy, so at i=0, we have None

或者使用三元条件来明确指定边缘大小写的处理方式:

...
a[2:(None if i==0 else i):-1]

答案 1 :(得分:1)

另一种方法是使用numpy.ix函数,这在切片时非常有用。

试试这个:

print a[np.ix_(np.arange(2,-1,-1)), :]

np.arange返回数组[2,1,0] - 您需要的行序列。您可以在np.ix中传递任何所需的序列来获取所需的行或列。请参阅示例here