在 2 个数组上广播函数时出现 DimensionMismatch 或 MethodError
DimensionMismatch or MethodError when broadcasting a function over 2 arrays
我尝试创建一个(有点)行为类似于 excel 中的 vlookup() 的函数,具有以下参数
function foo(val::Float64, table::AbstractArray, col::Int64)
return table[findfirst(x->val<=x, table[:,1]), 2]
end
假设我有一个 table 数组,看起来像
arr = 4x2 Matrix{Any}:
0.26 | "string1"
0.60 | "string2"
0.73 | "string3"
1.00 | "string4"
当我 运行 这个函数只有一个 Float64 作为参数时,它工作:
julia> foo(rand(), arr, 2)
"string3"
但是当使用点广播应用于 Float64 数组时,出现以下错误
julia> foo.(rand(3), arr, 2)
DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 3 and 4")
julia> foo.(rand(4), arr, 2)
MethodError: no method matching foo(::Float64, ::Float64, ::Int64)
我该如何解决这个问题?
您可以使用 Ref
在广播时将值视为标量:
julia> arr = [rand(4);; ["a", "b", "c", "d"]]
4×2 Matrix{Any}:
0.866715 "a"
0.0901788 "b"
0.385088 "c"
0.404498 "d"
julia> foo.(rand(3), Ref(arr), Ref(2))
3-element Vector{String}:
"a"
"a"
"a"
我尝试创建一个(有点)行为类似于 excel 中的 vlookup() 的函数,具有以下参数
function foo(val::Float64, table::AbstractArray, col::Int64)
return table[findfirst(x->val<=x, table[:,1]), 2]
end
假设我有一个 table 数组,看起来像
arr = 4x2 Matrix{Any}:
0.26 | "string1"
0.60 | "string2"
0.73 | "string3"
1.00 | "string4"
当我 运行 这个函数只有一个 Float64 作为参数时,它工作:
julia> foo(rand(), arr, 2)
"string3"
但是当使用点广播应用于 Float64 数组时,出现以下错误
julia> foo.(rand(3), arr, 2)
DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 3 and 4")
julia> foo.(rand(4), arr, 2)
MethodError: no method matching foo(::Float64, ::Float64, ::Int64)
我该如何解决这个问题?
您可以使用 Ref
在广播时将值视为标量:
julia> arr = [rand(4);; ["a", "b", "c", "d"]]
4×2 Matrix{Any}:
0.866715 "a"
0.0901788 "b"
0.385088 "c"
0.404498 "d"
julia> foo.(rand(3), Ref(arr), Ref(2))
3-element Vector{String}:
"a"
"a"
"a"