在Julia中将类型Array {Union {Missing,Float64},1}转换为Array {Float64,1}

时间:2019-03-15 04:12:19

标签: julia

我有一个带有一些缺失值的浮点数组,因此其类型为Array{Union{Missing, Float64},1}。是否有将非缺失部分转换为Array{Float64,1}的命令?

1 个答案:

答案 0 :(得分:5)

以下是三种解决方案,按优先顺序排列(感谢@BogumilKaminski的第一个解决方案):

f1(x) = collect(skipmissing(x))
f2(x) = Float64[ a for a in x if !ismissing(a) ]
f3(x) = x[.!ismissing.(x)]

f1skipmissing延迟加载数组(例如用于迭代),然后通过collect构建数组。

f2使用for循环,但可能比f1慢,因为最终数组长度没有提前计算。

f3使用广播,并在此过程中分配临时角色,因此可能是三个中最慢的一个。

我们可以通过一个简单的基准来验证上述内容:

using BenchmarkTools
x = Array{Union{Missing,Float64}}(undef, 100);
inds = unique(rand(1:100, 50));
x[inds] = randn(length(inds));
@btime f1($x);
@btime f2($x);
@btime f3($x);

结果:

julia> @btime f1($x);
  377.186 ns (7 allocations: 1.22 KiB)

julia> @btime f2($x);
  471.204 ns (8 allocations: 1.23 KiB)

julia> @btime f3($x);
  732.726 ns (6 allocations: 4.80 KiB)