按照这个技巧来获取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()],但他们只有每一个排序列.我也试过应用两者,但同样的事情发生了.
如果我错过了一些简单的事情,我很抱歉,但我一直在寻找这个...
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首先按最后一个键排序(这可能是一个很好的理由;它与在连续键上执行稳定排序相同).