Julia中怎么建立一个包含不同数据类型的向量

function recursive_arr(arr)
    res = arr[end] * exp(0.01)
    push!(arr, res)
    return arr
end

上面这段代码如果我调用的是recursive_arr([1])就会报错 InexactError,我想是因为向量的类型是Vector{Int64}的缘故,无法往里面追加浮点数。但是即便我改为下面将数组类型改为Union也还是同样报错

function recursive_arr(arr::Vector{T}) where T <: Union{Int64, Float64}
    res = arr[end] * exp(0.01)
    push!(arr, res)
    return arr
end

Julia能实现像Python中的list一样含有不同数据类型的向量吗

Vector{Any}

  1. 数组的数据类型是确定的,整型数组不能添加浮点型数据。如果要同时包含浮点数和整数,可以用 Real 或 Any 型数据。
    a = Real[1,2,3]
    push!(a, 1.1)
    
    非常不建议这种方式,这种情况更多是设计方案的缺陷,涉及浮点数说明属于数值计算任务,存在精度损失,就没必要夹杂整数类型数据,替代方式:
    # 浮点数据可以 push 整型
    a = [1.0, 2.0, 3] # 浮点型数据
    push!(a, 1) # 整型自动转浮点型
    # 整型加入浮点数可能报错,可以用 vcat 统一处理为浮点型
    a = [1,2,3] # 整型
    push!(a, 2.0) # 浮点转整型,存在风险
    push!(a, 2.2) # 报错
    vcat(a, [2.2]) # 返回浮点型
    
    从性能角度
    using BenchmarkTools
    a = Real[rand(rand([Int, Float64])) for _ in 1:10000];
    b = Float64.(a)
    @btime sum($a) # 198.642 μs
    @btime sum($b) # 934.733 ns
    
  1. 我也把数据类型函数派发混淆过。派发中的类型声明只是起检查作用,并不会影响输入数据的类型
2 个赞

感谢解答,刚才试了一下可以了,确实数组里混合浮点数和整数确实不太好,我想这也是为什么Numpy比Python的list快的原因,毕竟numpy数组的类型是确定的。

1 个赞