我有一个形式的字典
"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
但是,这似乎是一个漫长的解决方法,我想将其推广到更多维度。有什么想法吗? 预先感谢。
答案 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
(基本上,您可以使用名称或整数索引来引用列/行)
还请注意,我将row
和col
条目转换为String
,但我们也可以将它们保留为SubString
s(即,省略string.
部分调用),但是String
打印为NamedArray
行/列时看起来更好一些。