【问题标题】:python index in 2d matrix [duplicate]二维矩阵中的python索引[重复]
【发布时间】:2018-11-23 22:22:04
【问题描述】:

给定以下代码:

import numpy as np
mat = np.arange(1,26).reshape(5,5)

我的理解是以下几行是相同的:

mat[:3][1:2]
mat[:3,1:2]

但他们不是。为什么?

【问题讨论】:

  • mat[x][y]mat[x, y] 相同,仅当 x 是标量时,即如果它在第一个维度上选择一个项目。

标签: python python-3.x numpy numpy-indexing


【解决方案1】:

如果您在切片语法中只指定一个维度,则只会切片一个维度。在 NumPy 中,索引中的维度通常由 "," 分隔。

对于二维数组,您可以将“行”替换为“维度 1”,将“列”替换为“维度 2”。在您的示例中,mat[:3] 对前 3 行进行切片。随后的索引器 [1:2] 对这 3 行中的第一行进行切片。

在您的第二个示例中,[:3, 1:2] 同时对行和列进行切片。

查看结果的形状可能会有所帮助:

mat[:3].shape       # (3, 5)
mat[:3][1:2].shape  # (1, 5)
mat[:3,1:2].shape   # (3, 1)

【讨论】:

    【解决方案2】:

    你的矩阵:

    array([[ 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]])
    

    第一个mat[:3][1:2]会先取mat[:3]再申请[1:2]

    mat[:3]
    array([[ 1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10],
           [11, 12, 13, 14, 15]])
    # mat[:3][1:2] => array([[ 6,  7,  8,  9, 10]])
    

    而第二个 (mat[:3,1:2]) 声明:

    行至3

    array([[ 1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10],
           [11, 12, 13, 14, 15]])
    

    12

     array([[ 2],
           [ 7],
           [12]])
    

    结论,主要区别是第一个是在[:3]之后应用[1:2]

    【讨论】:

      【解决方案3】:

      原因如下:

      > mat
      
      # output:
      array([[ 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]])
      
      > mat[:3] # you are selecting the first 3 rows
      
      #output:
      array([[ 1,  2,  3,  4,  5],
             [ 6,  7,  8,  9, 10],
             [11, 12, 13, 14, 15]])
      
      > mat[:3][1:2] # you are selecting the second row only
      
      Output:
      array([[ 6,  7,  8,  9, 10]])
      
      > mat[:3,1:2] # you are selecting from the first 3 rows and the second column
      
      Output:
      array([[ 2],
             [ 7],
             [12]])
      

      【讨论】: