如果我有一个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之类的软件包,但如果不可能,我理解。
提前感谢。
提前感谢。
使用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's solution的解决方案:
Y[∉(x).(1:length(Y))]
在这里,我们使用了∉
的部分应用形式。从in
的文档中可以看到:
in(collection)
∈(collection)
创建一个函数,检查其参数是否在集合中,即等同于
y -> y in collection
的函数。
同样的事情可以用几种不同的方式来表达,例如Y[eachindex(Y) .∉ Ref(x)]
(适用于此案例,但您应该了解eachindex
并查看LinearIndices
和CartesianIndices
)。
x
很大时,这些解决方案的性能表现不佳。为了提高性能,可以从x
创建一个Set
。例如:Y[∉(Set(x)).(eachindex(Y))]