Python 示例
在 Numpy 中有lexsort可以在另一個陣列中對一個陣列進行排序:
給定多個排序鍵(可以解釋為電子表格中的列),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 中找不到類似的東西,所以我想知道如何實作這一點?在我的情況下,兩列就足夠了
朱莉婭
所以讓我們用相同的資料來弄清楚:
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幾乎是其他兩個的兩倍并且使用更少的記憶體
uj5u.com熱心網友回復:
對元組向量使用sort和sortperm函式:
julia> a = [1, 1, 1, 2, 2, 2];
julia> b = [10, 8, 11, 4, 8, 0];
julia> x = collect(zip(a, b))
6-element Vector{Tuple{Int64, Int64}}:
(1, 10)
(1, 8)
(1, 11)
(2, 4)
(2, 8)
(2, 0)
julia> sort(x)
6-element Vector{Tuple{Int64, Int64}}:
(1, 8)
(1, 10)
(1, 11)
(2, 0)
(2, 4)
(2, 8)
julia> sortperm(x) #indices
6-element Vector{Int64}:
2
1
3
6
4
5
uj5u.com熱心網友回復:
使用 DataFrames.jl 可以寫得更短一些:
using DataFrames
sortperm(DataFrame(a=a,b=b, copycols=false))
copycols=false是在創建資料框時避免不必要的向量副本。如果您不關心性能并且想要一個簡短的代碼,那么您甚至可以撰寫:
sortperm(DataFrame(; a, b))
uj5u.com熱心網友回復:
類似于 DataFrames 解決方案,但在依賴項方面更輕量級,一個不錯的解決方案是使用StructArrays包,它允許您將一對陣列視為元組陣列,而無需復制資料,然后您可以對其進行排序(元組按字典順序排序):
using StructArrays
i = sortperm(StructArray((a, b)))
除了查找排列陣列i并執行 之外b[i],您還可以執行以下操作:
sort!(StructArray((a, b)))
它按字典順序對兩者a和b就地排序(a[j], b[j])。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/494409.html
