Julia 中的字典元素操作
Dictionary element-wise operations in Julia
我想向字典的所有值广播一个操作。对于数组,我知道我可以使用以下方法广播元素操作:
julia> b1 = [1, 2, 3]
julia> b1./2
3-element Array{Float64,1}:
0.5
1.0
1.5
将同一操作广播到字典的所有值的有效方法是什么?比如说,对于字典
a1 = Dict("A"=>1, "B"=>2)
为字典的键和值定义了一个迭代协议,所以你可以这样做,例如:
julia> d = Dict("a"=>1, "b"=>2)
Dict{String,Int64} with 2 entries:
"b" => 2
"a" => 1
julia> values(d).^2
2-element Array{Int64,1}:
4
1
如果您想就地修改字典,请使用map!
,例如:
julia> map!(x->x^2, values(d))
Base.ValueIterator for a Dict{String,Int64} with 2 entries. Values:
4
1
julia> d
Dict{String,Int64} with 2 entries:
"b" => 4
"a" => 1
但是,您的函数必须输出可以转换回字典值类型的类型。在我的示例中,我计算 Int
的平方,得到 Int
。但是,在您除以 2 的问题中,这显然会产生 Float64
。如果无法将浮点数转换回整数,则会出现错误。
注意,您也可以通过密钥进行广播,例如:
julia> f(x) = "hello mr $(x)"
f (generic function with 1 method)
julia> f.(keys(d))
2-element Array{String,1}:
"hello mr b"
"hello mr a"
但这 不能 就地完成,即您不能在按键上使用 map!
。
重要的是,请注意您应该不实例化集合。事实上,这将是 低效的 。所以要避免这样的结构:collect(values(d)) ./ 2
.
我想向字典的所有值广播一个操作。对于数组,我知道我可以使用以下方法广播元素操作:
julia> b1 = [1, 2, 3]
julia> b1./2
3-element Array{Float64,1}:
0.5
1.0
1.5
将同一操作广播到字典的所有值的有效方法是什么?比如说,对于字典
a1 = Dict("A"=>1, "B"=>2)
为字典的键和值定义了一个迭代协议,所以你可以这样做,例如:
julia> d = Dict("a"=>1, "b"=>2)
Dict{String,Int64} with 2 entries:
"b" => 2
"a" => 1
julia> values(d).^2
2-element Array{Int64,1}:
4
1
如果您想就地修改字典,请使用map!
,例如:
julia> map!(x->x^2, values(d))
Base.ValueIterator for a Dict{String,Int64} with 2 entries. Values:
4
1
julia> d
Dict{String,Int64} with 2 entries:
"b" => 4
"a" => 1
但是,您的函数必须输出可以转换回字典值类型的类型。在我的示例中,我计算 Int
的平方,得到 Int
。但是,在您除以 2 的问题中,这显然会产生 Float64
。如果无法将浮点数转换回整数,则会出现错误。
注意,您也可以通过密钥进行广播,例如:
julia> f(x) = "hello mr $(x)"
f (generic function with 1 method)
julia> f.(keys(d))
2-element Array{String,1}:
"hello mr b"
"hello mr a"
但这 不能 就地完成,即您不能在按键上使用 map!
。
重要的是,请注意您应该不实例化集合。事实上,这将是 低效的 。所以要避免这样的结构:collect(values(d)) ./ 2
.