例:对数组[(3,2), (6,2), (3,6), (3,4), (5,3)]进行排序
方法一:
import numpy as np
a = np.array([(3,2), (6,2), (3,6), (3,4), (5,3)])
ind = np.lexsort((a[:,1],a[:,0]))
print(a[ind])
------------------------------------
[[3 2]
[3 4]
[3 6]
[5 3]
[6 2]]
其中np.lexsort((a[:,1],a[:,0]))是一个间接联合排序函数,意思根据给定参数从最后一个参数开始进行排序,如果最后一个参数给定的值相同,则根据倒数第二个参数进行排序,以此类推。
方法二:
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'])
print(a)
-------------------------------------
[[3 2]
[3 4]
[3 6]
[5 3]
[6 2]]
方法三:
import numpy as np
a = np.array([(3,2), (6,2), (3,6), (3,4), (5,3)])
atmp = np.sort_complex(a[:,0]+a[:,1]*1j)
b = np.array([[np.real(x), np.imag(x)] for x in atmp])
print(b)
-----------------------------------------------
[[3. 2.]
[3. 4.]
[3. 6.]
[5. 3.]
[6. 2.]]
其中np.sort_complex是一个复数直接排序函数,先用实部,然后用虚部排序一个复杂数组。
例:mat= [1.+2.j 3.+4.j 5.+6.j]
实部: [1. 3. 5.] 相当于:np.real
虚部: [2. 4. 6.] 相当与:np.imag
方法四:
import numpy as np
a = np.array([(3,2), (6,2), (3,6), (3,4), (5,3)])
b = np.array(sorted(sorted(a,key=lambda e:e[1]),key=lambda e:e[0]))
print(b)
-------------------------------------------
[[3 2]
[3 4]
[3 6]
[5 3]
[6 2]]
方法五:
a = np.random.randint(1,6,(10,3))
print(a)
b = a[np.lexsort(np.transpose(a)[::-1])]
print(b)
----------------------
[[4 3 4]
[5 1 5]
[2 4 1]
[5 3 5]
[2 4 3]
[1 3 2]
[4 4 5]
[3 2 1]
[1 4 5]
[3 2 5]]
[[1 3 2]
[1 4 5]
[2 4 1]
[2 4 3]
[3 2 1]
[3 2 5]
[4 3 4]
[4 4 5]
[5 1 5]
[5 3 5]]
其中np.transpose是坐标映射函数,其实就是交换了坐标轴,如:x.transpose(1, 2, 0)
,其实就是将x第二维度挪到第一维上,第三维移到第二维上,原本的第一维移动到第三维上,最后的shape为:(3,2,2)。