Python 以numpy的相反顺序索引索引0

Python 以numpy的相反顺序索引索引0,python,python-2.7,numpy,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],

我已经创建了一个矩阵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],这是完全错误的


我使用的是Python2.7,但它可能也与Python3相关。

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

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

将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]

请注意,切片从不包括停止索引中的项目
[开始,停止)
,因此从切片中排除第0个项目

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

将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]

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

试试这个:

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

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

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

试试这个:

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

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

对不起,我的问题似乎写得不好。我在预期用例中添加了一个扩展部分。是的,但我看不到区别。
I
从0开始,而不是-1,那么为什么要包括第0项在你的例子中,d?是的,它没有被包括在内。这就是问题所在。我希望它被包括在内。因此,如果我用-1来修复它,那么它仍然不会包括第0行。对不起,我的问题似乎被写得很糟糕。我添加了我预期用例的一个扩展部分。是的,但我看不到区别。
我从0开始,而不是-1,那么为什么要d第0行是否包含在您的示例中?是的,没有包含。这就是问题所在。我希望包含它。因此,如果我用-1修复它,那么它仍然不会包含第0行。有趣!我不知道这一点。谢谢。有趣!我不知道这一点。谢谢。可能是题外话,您是否希望将该循环向量化:
,因为我正在运行ge(a.shape[0]-3):
?如果是这样,输出
b
是否仍然是
2D
?是的。最后它将包含一个长度相同的数组列表。因此,要将其转换为干净的矩阵形式,我必须写:b=np。asarray(b)可能离题了,您是否希望将该循环向量化:
,用于范围内的I(a.shape[0]-3):
?如果是这样,输出的
b
是否仍然是
2D
?是的。最后它将包含一个长度相同的数组列表。因此,要将其转换为干净的矩阵形式,我必须写:b=np.asarray(b)