选择不属于基Julia中整数列表一部分的元素



如果我有一个Float64向量Y和一个整数向量x,例如x=rand(1:10000500(,有没有一种优雅的方法可以在非x条目中提取Y的元素?到目前为止,我已经尝试过Y[findall([i ∉ x for i in 1:1000])]。这是可行的,但来自R,我希望做一些类似Y[.!x]Y[!x]的事情,这两个都会抛出错误。我想避免使用DataFrames这样的软件包,但如果这不可能,我可以理解。

提前谢谢。

使用InvertedIndices中的Not(这也与DataFrames一起导入(。在您的情况下,这是Y[Not(x)],请参阅下面的代码:

julia> using InvertedIndices  # or using DataFrames
julia> Y  = collect(1:0.5:4)             
7-element Vector{Float64}:               
1.0                                     
1.5                                     
2.0                                     
2.5                                     
3.0                                     
3.5                                     
4.0                                     

julia> x=rand(1:7, 3)                    
3-element Vector{Int64}:                 
3                                       
2                                       
6                                       


julia> Y[Not(x)]                         
4-element Vector{Float64}:               
1.0                                     
2.5                                     
3.0                                     
4.0                                     

由于问题明确要求提供一个不依赖于标准库之外的包的解决方案,因此这里是Przemyslaw Szufel解决方案的替代方案:

Y[∉(x).(1:length(Y))]

这里我们使用的部分应用形式。来自in:的文档

in(collection)
∈(collection)

创建一个函数来检查其参数是否为CCD_ 12,即等效于CCD_ 13的函数。

同样的东西可以用几种不同的方式编写,例如Y[eachindex(Y) .∉ Ref(x)](适用于这种情况,但您应该理解eachindex并了解LinearIndicesCartesianIndices(。

需要注意的一点是,当x较大时,这些解决方案的性能并不好。为了提高性能,可以从x创建Set。示例:

Y[∉(Set(x)).(eachindex(Y))]

最新更新