按列对NumPy float数组进行排序

War*_*ick 9 python numpy

按照这个技巧来获取NumPy数组的唯一条目,我现在有一个双列数组,基本上是第一个元素在[0.9:0.02:1.1]范围内的对,第二个元素在[1.5:0.1:2.0]范围内].我们称之为A.目前,它完全未分类,即

In [111]: A
Out[111]: 
array([[ 1.1 ,  1.9 ],
       [ 1.06,  1.9 ],
       [ 1.08,  1.9 ],
       [ 1.08,  1.6 ],
       [ 0.9 ,  1.8 ],
       ...
       [ 1.04,  1.6 ],
       [ 0.96,  2.  ],
       [ 0.94,  2.  ],
       [ 0.98,  1.9 ]])
Run Code Online (Sandbox Code Playgroud)

我想对它进行排序,以便每行首先在第二列中增加,然后在第一列中增加.即

array([[ 0.9 ,  1.5 ],
       [ 0.9 ,  1.6 ],
       [ 0.9 ,  1.7 ],
       [ 0.9 ,  1.9 ],
       [ 0.9 ,  1.9 ],
       [ 0.9 ,  2.  ],
       [ 0.92,  1.5 ],
       ...
       [ 1.08,  2.  ],
       [ 1.1 ,  1.5 ],
       [ 1.1 ,  1.6 ],
       [ 1.1 ,  1.7 ],
       [ 1.1 ,  1.8 ],
       [ 1.1 ,  1.9 ],
       [ 1.1 ,  2.  ]])
Run Code Online (Sandbox Code Playgroud)

但我找不到一种可以同时给出两者的排序算法.作为建议在这里,我试过A[A[:,0].argsort()]A[A[:,1].argsort()],但他们只有每一个排序列.我也试过应用两者,但同样的事情发生了.

如果我错过了一些简单的事情,我很抱歉,但我一直在寻找这个...

eca*_*mur 6

numpy.lexsort 将在这里工作:

A[np.lexsort(A.T)]
Run Code Online (Sandbox Code Playgroud)

你需要A在传递给lexsort之前进行转置,因为当传递一个二维数组时,它需要按行排序(最后一行,第二行等).

另一种可能更清晰的方法是明确传递列:

A[np.lexsort((A[:, 0], A[:, 1]))]
Run Code Online (Sandbox Code Playgroud)

你仍然需要记住lexsort首先按最后一个键排序(这可能是一个很好的理由;它与在连续键上执行稳定排序相同).