正如标题所示,我需要按某个矩阵的列之一对其进行排序,如果可能的话,最好将其排在适当的位置。所述列包含String
(数组的类型为Array{Union{Float64,String}}
),理想情况下,行应以字母顺序结束,由该列确定。线
sorted_rows = sort!(data, by = i -> data[i,2]),
其中data
是我的矩阵,产生错误ERROR: LoadError: UndefKeywordError: keyword argument dims not assigned
。指定我要排序的矩阵的哪一部分,并添加参数dims=2
(我假设这是我要排序的维度),即
sorted_rows = sort!(data[2:end-1,:], by = i -> data[i,2],dims=2)
只需将错误消息更改为ERROR: LoadError: ArgumentError: invalid index: 01 Suurin yhteinen tekijä ja pienin yhteinen jaettava of type String
。因此,编译器抱怨字符串是无效索引。
关于如何完成这种排序的任何想法?我应该说,在这种情况下,可以期望列中的字符串以数字开头,但是我不介意找到在一般情况下都可以使用的解决方案。
我正在使用Julia 1.1。
答案 0 :(得分:7)
您想要sortslices
,而不是sort
-后者只是对所有列进行独立排序,而前者会重新排列整个切片。其次,by
函数不使用 index ,而是使用将要比较的 value (并允许您以某种方式对其进行转换)。因此:
julia> using Random
data = Union{Float64, String}[randn(100) [randstring(10) for _ in 1:100]]
100×2 Array{Union{Float64, String},2}:
0.211015 "6VPQbWU5f9"
-0.292298 "HgvHLkufqI"
1.74231 "zTCu1U5Vdl"
0.195822 "O3j43sbhKV"
⋮
-0.369007 "VzFH2OpWfU"
-1.30459 "6C68G64AWg"
-1.02434 "rldaQ3e0GE"
1.61653 "vjvn1SX3FW"
julia> sortslices(data, by=x->x[2], dims=1)
100×2 Array{Union{Float64, String},2}:
0.229143 "0syMQ7AFgQ"
-0.642065 "0wUew61bI5"
1.16888 "12PUn4V4gL"
-0.266574 "1Z2ONSBP04"
⋮
1.85761 "y2DDANcFCe"
1.53337 "yZju1uQqMM"
1.74231 "zTCu1U5Vdl"
0.974607 "zdiU0sVOZt"
很遗憾,我们还没有一个就地的sortslices!
,但是您可以使用sortperm
轻松地构建一个排序视图。使用这种方法可能不会很快,但是如果出于语义原因需要就地安装,那么就可以解决问题。
julia> p = sortperm(data[:,2]);
julia> @view data[p, :]
100×2 view(::Array{Union{Float64, String},2}, [26, 45, 90, 87, 6, 96, 82, 75, 12, 27 … 53, 69, 100, 93, 36, 37, 39, 8, 3, 61], :) with eltype Union{Float64, String}:
0.229143 "0syMQ7AFgQ"
-0.642065 "0wUew61bI5"
1.16888 "12PUn4V4gL"
-0.266574 "1Z2ONSBP04"
⋮
1.85761 "y2DDANcFCe"
1.53337 "yZju1uQqMM"
1.74231 "zTCu1U5Vdl"
0.974607 "zdiU0sVOZt"
(如果出于性能原因需要就位,我建议您使用DataFrame或类似的结构将其列作为独立的同质矢量保存-Union{Float64, String}
的速度将比两个单独的井慢-类型化的向量,然后sort!
插入DataFrame即可根据需要在整行上使用。)
答案 1 :(得分:1)
您可能想看看SortingLab.jl
的快速字符串排序功能。
]add SortingLab
using SortingLab
idx = fsortperm(data[:,2])
new_data = data[idx]