【问题标题】:Individually sort columns of 2D arrays within a 3D array based on their individual rows根据各自的行对 3D 数组中的 2D 数组的列进行单独排序
【发布时间】:2021-12-12 19:33:07
【问题描述】:

我知道我们可以通过以下方式根据行对 2D numpy 数组的列进行排序:

a = np.array([[1,4,7],
              [3,1,5],
              [9,5,8]])

a = a[:, a[1, :].argsort()]

Out: [[4,1,7],
      [1,3,5],
      [5,9,8]]

请注意,这确实是我想要的。第二行 (index=1) 现在已排序,第 0 行和第 2 行中的值也相应移动。即,列位置根据第 1 行的排序顺序而变化。

但现在我的问题是: 我没有 2D 数组,而是 3D 数组(即 2D 数组的数组)。

a = np.array([[[1,4,7],
               [3,1,5],
               [9,5,8]],
              [[2,8,7],
               [3,8,1],
               [9,2,8]]])

我仍然想根据它们各自行 1 的值对 2D 数组的列进行单独排序。期望的结果是:

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

我尝试了以下方法,但结果不理想:

a = a[:, :, a[: , 1, :].argsort()]

【问题讨论】:

    标签: python arrays numpy sorting


    【解决方案1】:

    试试np.take_along_axis:

    np.take_along_axis(a,a[:,1].argsort()[:,None], axis=2)
    

    输出:

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

    老实说,不要问我为什么会这样 :-)

    【讨论】:

      【解决方案2】:

      您可以使用numpy.argsort 和numpy.take_along_axis 的组合:

      idx = np.argsort(a, axis=2)
      np.take_along_axis(a, idx[:,None,1], axis=2)
      

      它的工作原理是从 argsort 获取排序顺序,然后只保留相关行(此处为 1),重新调整以在所有其他行上广播 take_along_axis 的操作。

      输出:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2014-10-02
        • 1970-01-01
        • 2023-02-24
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        相关资源
        最近更新 更多