Julia中如何实现类似NumPy lexsort的双数组排序功能
Python示例
NumPy中提供了lexsort方法,可实现数组间的嵌套排序:
该方法接收多个可类比为电子表格列的排序键,返回按多列规则排序后的整数索引数组。
参考如下示例:
import numpy as np a = np.array([1,1,1,2,2,2]) b = np.array([10,8,11,4,8,0]) sorted_idx = np.lexsort((b,a)) print(b[sorted_idx]) # [ 8 10 11 0 4 8]
上述代码实现了先按a分组、组内对b排序的效果,排序结果如下:
1 1 1 2 2 2 8 10 11 0 4 8
我在Julia中未找到类似功能,想了解如何实现该需求,当前仅需要支持两列的排序场景即可。
Julia实现
我们使用相同的测试数据探索实现方案:
a = Vector([1,1,1,2,2,2]) b = Vector([10,8,11,4,8,0])
简单基准测试
using StructArrays using DataFrames using BenchmarkTools a = rand(100000) b = rand(100000) function f1(a, b) return sortperm(StructArray((a, b))) end function f2(a, b) return sortperm(DataFrame(a=a,b=b, copycols=false)) end function f3(a, b) return sortperm(collect(zip(a, b))) end @btime f1(a,b) @btime f2(a,b) @btime f3(a,b)
测试结果如下:
6.075 ms (8 allocations: 781.50 KiB) 13.808 ms (8291 allocations: 5.93 MiB) 15.892 ms (7 allocations: 2.29 MiB)
可以看到基于StructArray的实现速度几乎是另外两种方案的2倍,且内存占用更低。
内容的提问来源于stack exchange,提问作者CodeNoob
相关产品推荐
相关产品推荐

