我有一个形状为(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
使用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.ravel()
a
C_CONTIGUOUS
ravel
flatten
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,以及:
b
print(a) # [[3 2] # [3 4] # [3 6] # [5 3] # [6 2]]