按另一个数组的列对一个数组进行排序 - Python

Sil*_*nna 3 python arrays sorting numpy

我有两个数组,ab,如下:

a = array([[19.        ,  0.84722222],
           [49.        ,  0.86111111],
           [54.        ,  0.86666667],
           [42.        ,  0.9       ],
           [ 7.        ,  0.91111111],
           [46.        ,  0.99722222]])

b = array([[46.        ,  0.46944444],
       [49.        ,  0.59722222],
       [19.        ,  0.63611111],
       [42.        ,  0.72777778],
       [54.        ,  0.74722222],
       [ 7.        ,  0.98888889]])
Run Code Online (Sandbox Code Playgroud)

我想排序b,使其第一列与 array 的第一列匹配a。我的输出应该是

b = array([[19.        ,  0.63611111],
           [49.        ,  0.59722222],
           [54.        ,  0.74722222],
           [42.        ,  0.72777778],
           [ 7.        ,  0.98888889]
           [46.        ,  0.46944444]])
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 6

从概念上讲,您希望获得将 0b列变成 0列的索引a。想象一下argsort两者都做。这将为您提供从ab到排序状态的索引。现在,如果您对a索引应用逆操作,它将告诉您如何从 sorted 返回到a. 碰巧,argsort是它自己的逆。因此,我向您介绍以下内容:

index = np.argsort(b[:, 0])[np.argsort(np.argsort(a[:, 0]))]
b = b[index, ...]
Run Code Online (Sandbox Code Playgroud)

O(n log n)由于三种类型,这是时间复杂度。这里的其他解决方案是O(n^2)因为它们对每个索引执行线性搜索。