【问题标题】:Prevent type changes when constructing an Array{Any} in Julia在 Julia 中构造 Array{Any} 时防止类型更改
【发布时间】:2021-09-30 23:27:52
【问题描述】:

我想像这样制作一个 Array{Any}:

julia> Array{Any}([false   ,  0.5,  5 ])
3-element Vector{Any}:
 0.0
 0.5
 5.0

但它将 Bool 和整数转换为浮点数。但是当我有一个字符串时,它不会进行类型转换。

julia> Array{Any}([false,0.5,5,"test"])
4-element Vector{Any}:
 false
 0.5
 5
 "test"

简单的解决方法是创建数组,然后将每个条目手动转换为我最初编写的类型。或者执行第二个选项,然后删除最后一个条目。有没有一种更简洁(最好是一行)的方法来使数组完全符合我最初编写的类型?

【问题讨论】:

    标签: arrays type-conversion julia


    【解决方案1】:

    如果你不关心类型和编译加速,你可以写:

    julia> [false,0.5,5,"test"]
    4-element Vector{Any}:
     false
     0.5
     5
     "test"
    

    如果你更关心类型,你可以使用这个:

    julia> a = Union{Bool, Float64, Int, String}[false, 0.5, 5, "test"]
    4-element Vector{Union{Bool, Float64, Int64, String}}:
     false
     0.5
     5
     "test"
    

    更好但不是很好。异构数组在 Julia 中不是一个好习惯。使用 composite typestuples 构建数据结构可以使内容更具可读性(并且可以自我记录),并且可能会提高您的性能。

    【讨论】:

      【解决方案2】:

      只要做:

      julia> Any[false, 0.5, 5]
      3-element Vector{Any}:
       false
           0.5
           5
      

      注意:

      julia> [false, 0.5, 5]
      3-element Vector{Float64}:
       0.0
       0.5
       5.0
      

      因此它创建了Float64Vector,因为这是一个捕获所有值的类型,并且用Vector{Any}() 包装它为时已晚。

      【讨论】:

        猜你喜欢
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多