【问题标题】:numpy fancy indexing axis ordernumpy 花式索引轴顺序
【发布时间】:2021-10-24 14:52:09
【问题描述】:

我在使用 numpy 花式索引时遇到问题,我不知何故无法理解。 我知道,我可以得到这样的行子矩阵数组:

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = A[np.array([[0,1],[1,2]])] 

这给出了:

array([[[1, 2, 3],
    [4, 5, 6]],

   [[4, 5, 6],
    [7, 8, 9]]])

一个三维 numpy 数组,包含矩阵,分别包括 A 的第一、第二行和第二、第三行。 我现在想要的是对于 A 的 cols 应该给出的基本相同的操作

array([[[1, 2],
      [4, 5],
      [7, 8]],

      [[2, 3],
      [5, 6],
      [8, 9]]])

但是

B = A[:,np.array([[0,1],[1,2]])] 

不起作用(可能是因为索引评估的顺序)。它给了

array([[[1, 2],
    [2, 3]],

   [[4, 5],
    [5, 6]],

   [[7, 8],
    [8, 9]]])

我怎样才能以最好的方式做到这一点?我应该使用转置矩阵吗?

【问题讨论】:

  • 什么是“numpy 花式索引”?
  • 我不确定这是否是一个共同的教派。但我的意思是,你用另一个数组索引一个 numpy 数组。在 numpy 文档中,我认为他们称之为“高级索引”
  • 显示错误B

标签: python arrays numpy indexing


【解决方案1】:

你得到一个 (3,2,2) 数组:

In [417]: B
Out[417]: 
array([[[1, 2],
        [2, 3]],

       [[4, 5],
        [5, 6]],

       [[7, 8],
        [8, 9]]])

3 来自 A 的第一个轴。(2,2) 来自B

交换前 2 个轴:

In [418]: B.transpose(1,0,2)
Out[418]: 
array([[[1, 2],
        [4, 5],
        [7, 8]],

       [[2, 3],
        [5, 6],
        [8, 9]]])

一个 (2,3,2) 数组

【讨论】:

    【解决方案2】:

    试试这个:

    A = np.array([[1,2,3],[4,5,6],[7,8,9]])
    B = A[np.array([[0,1,2],[0,1,2]])]
    C = [list(), list()]
    for i in range(2):
        for j in  range(3):
            C[i].append(list(B[i][j][:2]) if i==0 else list(B[i][j][1:3])) 
            
    C = np.array(C)
    C
    

    输出:

    array([[[1, 2],
            [4, 5],
            [7, 8]],
    
           [[2, 3],
            [5, 6],
            [8, 9]]])
    

    【讨论】:

    • 嗯...虽然这似乎是一个优雅的解决方案 =) 我正在寻找没有 for 循环的矢量化的东西。我也够了 A -> C
    【解决方案3】:

    一种方法是从A.T 创建B 然后swapaxes

    import numpy as np
    
    A = np.array([[1,2,3],[4,5,6],[7,8,9]])
    
    B = A.T[np.array([[0,1],[1,2]])] 
    
    C = B.swapaxes(-2,-1)
    

    检查中间步骤和结果:

    B
    array([[[1, 4, 7],
            [2, 5, 8]],
    
           [[2, 5, 8],
            [3, 6, 9]]])
    
    C 
    array([[[1, 2],
            [4, 5],
            [7, 8]],
    
           [[2, 3],
            [5, 6],
            [8, 9]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2012-03-14
      • 2017-12-28
      • 1970-01-01
      • 2016-04-28
      • 2012-02-03
      相关资源
      最近更新 更多