如何理解numpy的组合切片和索引示例

时间:2016-10-05 05:29:21

标签: python arrays numpy indexing

我试图理解numpy的组合切片和索引概念,但是我不确定如何正确地从numpy的输出中获得以下结果(手动以便我们可以理解numpy过程如何组合切片和索引,哪一个将是过程先?):

>>> import numpy as np
>>> a=np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i=np.array([[0,1],[2,2]])
>>> a[i,:]
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [ 8,  9, 10, 11]]])
>>> j=np.array([[2,1],[3,3]])
>>> a[:,j]
array([[[ 2,  1],
        [ 3,  3]],

       [[ 6,  5],
        [ 7,  7]],

       [[10,  9],
        [11, 11]]])
>>> aj=a[:,j]
>>> aj.shape
(3L, 2L, 2L)

我对aj的形状如何成为(3,2,2)以上输​​出感到有点困惑,任何详细的解释都非常感谢,谢谢!

2 个答案:

答案 0 :(得分:1)

每当使用索引数组时,结果的形状与索引相同;例如:

>>> x = np.ones(5)
>>> i = np.array([[0, 1], [1, 0]])
>>> x[i]
array([[ 1.,  1.],
       [ 1.,  1.]])

我们使用2x2数组编制索引,结果是2x2数组。 与切片组合时,切片的大小将保留。例如:

>>> x = np.ones((5, 3))
>>> x[i, :].shape
(2, 2, 3)

如果第一个示例是2x2项目数组,则此示例是2x2(长度为3)行的数组。

切换切片的顺序时也是如此:

>>> x = np.ones((5, 3))
>>> x[:, i].shape
(5, 2, 2)

这可以被认为是五个2x2阵列的列表。

请记住:当任何维度使用列表或数组建立索引时,结果的形状为 indices ,而不是输入的形状。

答案 1 :(得分:0)

a[:,j][0]相当于a[0,j][0, 1, 2, 3][j],它会为您提供[[2, 1], [3, 3]])

a[:,j][1]相当于a[1,j][4, 5, 6, 7][j],它会为您提供[[6, 5], [7, 7]])

a[:,j][2]相当于a[2,j][8, 9, 10, 11][j],它会为您提供[[10, 9], [11, 11]])