问题描述
我有 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)
上的 m
。 dims = 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 了解详情。