在 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)

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

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

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

解决方法

想出了一些有用的东西!

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

在一行中,这是在所需矩阵 mapslices(r -> invperm(sortperm(r,rev=true)),m; dims=2) 上的 mdims = 2 是按行进行操作。

我暂时将此问题标记为已解决,但请告诉我是否有更干净/更快的方法来做到这一点。

编辑:感谢@phipsgabler,用更自然的 mapslices(invperm,mapslices(sortperm,-m; dims = 2); dims = 2) 替换了我语法上笨拙的 $ ./network.sh up createChannel $ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript/ -ccl javascript $ node app.js

,

此类功能由 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 了解详情。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...