首页 > 解决方案 > 如何按数组元素的第一项排序?

问题描述

假设我有一个表格数组

a = [ 
  [ [12, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 10, 2], [7, 10, 3 ,2] ],
  [ [13, 23, 4, 5] , [10, 12, 4, 2], [2, 2, 12, 1], [7, 10, 3 ,2] ],
  [ [4, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 3, 2], [7, 10, 3 ,2] ], 
] 

我想按每个元素的第一列进行排序,因此第一个条目a将显示为:

[ [2, 2, 10, 2], [7, 10, 3 ,2], [10, 12, 4, 2], [12, 4, 2, 5] ]

我找到了一个看起来像的解决方案,a[a[:,1].argsort()]并在第一个索引上尝试了一个 for 循环,例如:

for i in range(0,4):
  a[i,...] = a[a[i,0,:].argsort()]

或者

for i in range(0,4):
  a[i,...] = a[i, a[i,0,:].argsort()]

这行不通。我真的无法解决这个问题。

标签: pythonnumpysorting

解决方案


您可以使用argsort沿第一列索引的数组,并适当地扩展 dims,然后np.take_along_axis

ixs = a[...,0].argsort(1)[...,None]
np.take_along_axis(a, ixs, 1)

array([[[ 2,  2, 10,  2],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2],
        [12,  4,  2,  5]],

       [[ 2,  2, 12,  1],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2],
        [13, 23,  4,  5]],

       [[ 2,  2,  3,  2],
        [ 4,  4,  2,  5],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2]]])

推荐阅读