用Julia的字典制作一个矩阵,其中的键是我必须拆分的字符串

时间:2018-11-14 14:51:19

标签: julia

我有一个形式的字典

"san-diego.new-york" => 0.225
"seattle.topeka"     => 0.162
"san-diego.chicago"  => 0.162
"seattle.new-york"   => 0.225
"san-diego.topeka"   => 0.126
"seattle.chicago"    => 0.153

我想将其转换为2x3矩阵,其中i是集合san-diego, seattle,而j是集合new-york, topeka, chicago。我尝试过使用split.(keys(dict),".")拆分密钥,但没有成功。

我想这样做是为了以后进行M[i][j]=0.5形式的计算。

edit:我做了一个新的字典,其中的键是元组。我不知道这是否有帮助。

c = Dict("san-diego.new-york" => 0.225, "seattle.topeka" => 0.162, "san-diego.chicago"  => 0.162
, "seattle.new-york"   => 0.225, "san-diego.topeka"   => 0.126, "seattle.chicago"    => 0.153)

a = split.(keys(c),".")
b = collect(values(c))

new_c = Dict((a[i][1],a[i][2])=>b[i] for i in 1:length(b))

我最终编写了以下函数

function fillmatrix()

    c = Dict("san-diego.new-york" => 0.225, "seattle.topeka"     => 0.162, "san-diego.chicago"  => 0.162
    , "seattle.new-york"   => 0.225, "san-diego.topeka"   => 0.126, "seattle.chicago"    => 0.153)

    a = split.(keys(c),".")
    b = collect(values(c))

    new_c = Dict((a[i][1],a[i][2])=>b[i] for i=1:length(b))

    list_i = []
    list_j = []
    for (u,v) in keys(new_c)
        push!(list_i,u)
        push!(list_j,v)
    end

    i = unique(list_i)
    j = unique(list_j)

    A = zeros((length(i),length(j)))


    for ii in i
        for jj in j
            A[findfirst(x->x==ii,i),findfirst(x->x==jj,j)] = new_c[(ii,jj)]
        end
    end

    return A
end

但是,这似乎是一个漫长的解决方法,我想将其推广到更多维度。有什么想法吗? 预先感谢。

1 个答案:

答案 0 :(得分:3)

我会从您的原始词典中提供解决方案(其他可以相应调整)。您可以使用NamedArrays.jl包来解决您的问题。这是一个完整的解决方案:

using NamedArrays

d = Dict("san-diego.new-york" => 0.225,
         "seattle.topeka"     => 0.162,
         "san-diego.chicago"  => 0.162,
         "seattle.new-york"   => 0.225,
         "san-diego.topeka"   => 0.126,
         "seattle.chicago"    => 0.153)

s = split.(keys(d), '.')
row = unique(string.(getindex.(s, 1)))
col = unique(string.(getindex.(s, 2)))

m = NamedArray([d[r*"."*c] for r in row, c in col],
               (row, col), ("from", "to"))

(这假定存在所有行-列对,否则用d[r*"."*c]get(d, r*"."*c, missing)而不是字典中不存在的条目中缺少值)

现在您可以编写:

julia> m
2×3 Named Array{Float64,2}
from ╲ to │ new-york    topeka   chicago
──────────┼─────────────────────────────
san-diego │    0.225     0.126     0.162
seattle   │    0.225     0.162     0.153

julia> m["san-diego", "new-york"]
0.225

julia> m[2,3]
0.153

(基本上,您可以使用名称或整数索引来引用列/行)

还请注意,我将rowcol条目转换为String,但我们也可以将它们保留为SubString s(即,省略string.部分调用),但是String打印为NamedArray行/列时看起来更好一些。