一尘不染

按多个轴对二维numpy数组排序

python

我有一个形状为(N,2)的2D numpy数组,其中包含N个点(x和y坐标)。例如:

array([[3, 2],
       [6, 2],
       [3, 6],
       [3, 4],
       [5, 3]])

我想对它进行排序,以使我的点按x坐标排序,然后在x坐标相同的情况下按y排序。因此,上面的数组应如下所示:

array([[3, 2],
       [3, 4],
       [3, 6],
       [5, 3],
       [6, 2]])

如果这是正常的Python列表,我将简单地定义一个比较器来执行我想要的操作,但是据我所知,numpy的sort函数不接受用户定义的比较器。有任何想法吗?


编辑:感谢您的想法!我建立了一个具有1000000个随机整数点的快速测试用例,并对可以运行的基准点进行了基准测试(对不起,目前无法升级numpy)。

Mine:   4.078 secs 
mtrw:   7.046 secs
unutbu: 0.453 secs

阅读 133

收藏
2020-12-20

共1个答案

一尘不染

使用lexsort

import numpy as np    
a = np.array([(3, 2), (6, 2), (3, 6), (3, 4), (5, 3)])

ind = np.lexsort((a[:,1],a[:,0]))

a[ind]
# array([[3, 2],
#       [3, 4],
#       [3, 6],
#       [5, 3],
#       [6, 2]])

a.ravel()如果a为,则返回一个视图C_CONTIGUOUS。如果是这样的话,@ars的方法(通过使用ravel代替稍作修改)将flatten产生一种很好a的就地 排序方法:

a = np.array([(3, 2), (6, 2), (3, 6), (3, 4), (5, 3)])
dt = [('col1', a.dtype),('col2', a.dtype)]
assert a.flags['C_CONTIGUOUS']
b = a.ravel().view(dt)
b.sort(order=['col1','col2'])

由于b是一个视图a,排序b排序a,以及:

print(a)
# [[3 2]
#  [3 4]
#  [3 6]
#  [5 3]
#  [6 2]]
2020-12-20