向量化按numpy中多维数组的Paritular元素排序

Vectorize Sort by Paritular element of multidimensional array in numpy

我有一个形状为 (1000000,3,2) 的多维数组。本质上它是 100 万组样本,每个样本是 3 个坐标(每个坐标都有一个 x 和 y 分量)。我想按每个坐标的 y 分量对每个样本进行排序。例如,如果 vecCoords 是完整数组并且我有一个样本是 vecCoords[0,:,:] = [[1,3],[2,1],[4,2]],我希望它排序为给我 [[2,1],[4,2],[1,3]]。我被矢量化了,所以它对 100 万个样本中的每一个都完成了。所以,输出形状仍然是 (1000000,3,2)。我试过迭代地做,但我的代码没有给我正确的结果,而且它也比我想要的要慢。

制作一个小样本数组:

In [153]: arr = np.random.randint(0,100,(4,3,2))
In [154]: arr
Out[154]: 
array([[[21, 12],
        [15, 31],
        [17, 88]],

       [[35, 81],
        [99, 58],
        [39, 46]],

       [[54, 54],
        [85, 71],
        [ 9, 19]],

       [[25, 46],
        [62, 61],
        [74, 69]]])

您要排序的值:

In [155]: arr[:,:,1]
Out[155]: 
array([[12, 31, 88],
       [81, 58, 46],
       [54, 71, 19],
       [46, 61, 69]])
In [156]: idx=np.argsort(arr[:,:,1], axis=1)
In [157]: idx
Out[157]: 
array([[0, 1, 2],
       [2, 1, 0],
       [2, 0, 1],
       [0, 1, 2]])

在一架飞机上测试这种类型:

In [159]: arr[1,idx[1],:]
Out[159]: 
array([[39, 46],
       [99, 58],
       [35, 81]])

应用于所有平面:

In [161]: arr[np.arange(arr.shape[0])[:,None], idx,:]
Out[161]: 
array([[[21, 12],
        [15, 31],
        [17, 88]],

       [[39, 46],
        [99, 58],
        [35, 81]],

       [[ 9, 19],
        [54, 54],
        [85, 71]],

       [[25, 46],
        [62, 61],
        [74, 69]]])

虽然我已经大致了解了我的方向,但我仍然需要进行一些实验。

一个新功能应该可以使这更容易 - 尽管即使在这里我也必须尝试一些事情:

In [168]: np.take_along_axis(arr,idx[:,:,None], axis=1)
Out[168]: 
array([[[21, 12],
        [15, 31],
        [17, 88]],

       [[39, 46],
        [99, 58],
        [35, 81]],

       [[ 9, 19],
        [54, 54],
        [85, 71]],

       [[25, 46],
        [62, 61],
        [74, 69]]])