如何在Julia中将Float类型的数组转换为Any?
我想python like list在 Julia中将数组转换为 a 。
要创建一个数组,type Any可以使用此语法初始化一个空数组array = []。但是,如果我想执行转换,即让一个类型的数组Array(Float64,1)来输入Any,那么正确的方法是什么?
或者如果有任何其他方法可以在 Julia 中创建列表?
我创建一个函数的方法,该函数接受一个数组并将其转换为任何类型:
function list(x)
x = convert(Any, x)
return x
end
x_test = [0.19, 0.03, 0.27]
t1 = typeof(x_test)
println("type of x_test is: $t1")
x_test = list(x_test)
t2 = typeof(x_test)
println("type of x_test is: $t2")
Output:
type of x_test is: Array{Float64,1}
type of x_test is: Array{Float64,1}
请提出实现此转换任务的方法或解决方案。
谢谢。
回答
你可以做:
julia> list(x) = Any[i for i ? x]
list (generic function with 1 method)
julia> list([0.19, 0.03, 0.25])
3-element Vector{Any}:
0.19
0.03
0.25
但正如奥斯卡在他的评论中所说,你为什么要这样做?确实,由于缺乏类型信息,Python 性能经常受到影响,这并不意味着如果您故意阻止编译器优化,Julia 会变得“像 Python”(尽管在几乎所有情况下它都会变得更慢!)
- Note that depending on how irregular your data is, a small union might do the trick, eg `Array{Union{Float64, String}, 1}`
回答
最短的形式Vector{Any}(a)就像这里的代码:
julia> a=[1,2,3]
3-element Vector{Int64}:
1
2
3
julia> Vector{Any}(a)
3-element Vector{Any}:
1
2
3
但是,如果您希望能够保留a其他元素(例如Strings)的副本,那么通过严格说明以下内容会更有效率:
julia> b = Vector{Union{eltype(a),String}}(a)
3-element Vector{Union{Int64, String}}:
1
2
3
julia> push!(b,"jan")
4-element Vector{Union{Int64, String}}:
1
2
3
"jan"
- Actually, `Any[a...]` is shorter, but less efficient.