在基础的Julia语言中,选择不属于整数列表的元素

3
如果我有一个Float64向量Y和一个整数向量x,例如x = rand(1:1000,500),是否有一种优雅的方法来提取非x条目处的Y元素?到目前为止,我尝试过Y [findall([i∉x for i in 1:1000])]。这有效,但由于从R过来,我希望像Y [.!x]或Y [!x]这样做些什么,它们都会引发错误。我想避免使用诸如DataFrames之类的软件包,但如果不可能,我理解。
提前感谢。
2个回答

4

使用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                                     

1

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

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

在这里,我们使用了的部分应用形式。从in的文档中可以看到:

in(collection)
∈(collection)

创建一个函数,检查其参数是否在集合中,即等同于y -> y in collection的函数。

同样的事情可以用几种不同的方式来表达,例如Y[eachindex(Y) .∉ Ref(x)](适用于此案例,但您应该了解eachindex并查看LinearIndicesCartesianIndices)。

重要的一点是,当x很大时,这些解决方案的性能表现不佳。为了提高性能,可以从x创建一个Set。例如:
Y[∉(Set(x)).(eachindex(Y))]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接