实现二维数组或多维数组排序得方法

例:对数组[(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)。

猜你喜欢

转载自blog.csdn.net/m0_62278731/article/details/131653938