在 julia 中对每个矩阵列进行排序

Ranking over each matrix column's sort in julia

我有 4 个学生在 3 次不同考试中的分数矩阵 (m)。

4 3 1
3 2 5
8 4 6
1 5 2

我想知道,对于每个学生,他们在哪次考试中表现最好和最差。期望的输出:

1 2 3
2 3 1
1 3 2
3 1 2

现在,我是这门语言的新手(一般来说是编码),所以我阅读了 GeeksforGeeks 的 page on sorting in Julia 并尝试了

mapslices(sortperm, -m; dims = 2)

然而,这给出了一些微妙的不同:每一行的矩阵是排序的 index

1 2 3
3 1 2
1 3 2
2 3 1

也许这很明显,但我现在意识到这实际上不是我想要的,但我找不到内置的 function/fast 方法来完成此操作。有任何想法吗?最好不要遍历 matrix/row 中的项目,因为实际上我的矩阵非常非常大。谢谢!

想出了一些可行的方法!

运行 m_index_rank = mapslices(sortperm, -m; dims = 2) 在矩阵上,通过索引得到每一行的排名。然后,意识到这是在每一行中远离所需输出的反向排列,运行 mapslices(invperm, m_index_rank; dims = 2) 以获得所需结果。

在一行中,这是对所需矩阵 mmapslices(r -> invperm(sortperm(r, rev=true)), m; dims=2)dims = 2是按行进行运算。

我暂时将此标记为已解决,但如果有 cleaner/faster 方法可以做到这一点,请告诉我。

编辑:感谢@phipsgabler

,用更自然的语法替换了我语法笨拙的 mapslices(invperm, mapslices(sortperm, -m; dims = 2); dims = 2)

此类功能由 StatsBase.jl 提供。这是一个例子:

julia> using StatsBase

julia> m = [4 3 1
            3 2 5
            8 4 6
            1 5 2]
4×3 Array{Int64,2}:
 4  3  1
 3  2  5
 8  4  6
 1  5  2

julia> mapslices(x -> ordinalrank(x, rev=true), m, dims = 2)
4×3 Array{Int64,2}:
 1  2  3
 2  3  1
 1  3  2
 3  1  2

您可能想使用其他排名,具体取决于您希望如何拆分领带,请参阅 here 了解详细信息。