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

文章介绍了使用numpy库对二维数组进行排序的五种方法,包括lexsort的间接排序、基于dtype的排序、sort_complex的复数排序以及两次sorted函数的组合使用。这些方法分别利用不同策略对数组的列进行联合排序,确保在多个关键列上达到正确的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值