按包含字符串的列之一对Julia 1.1矩阵进行排序

时间:2019-03-26 17:57:46

标签: arrays string sorting julia

正如标题所示,我需要按某个矩阵的列之一对其进行排序,如果可能的话,最好将其排在适当的位置。所述列包含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。

2 个答案:

答案 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]