我有一个带有一些缺失值的浮点数组,因此其类型为Array{Union{Missing, Float64},1}
。是否有将非缺失部分转换为Array{Float64,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)]
f1
将skipmissing
延迟加载数组(例如用于迭代),然后通过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)