基于索引排除数组元素 (Julia)

17

在Julia中,通过索引过滤数组的最自然的方法是什么?最简单的例子是省略第k个元素:

什么是在Julia中通过索引过滤数组的最自然方式?最简单的例子便是通过省略第k个元素实现:

A = [1,2,3,4,5,6,7,8]
k = 4

[getindex(A, i) for i = 1:8 if i != k]
上述方法可行,但与 R 中简单的 A[-k] 相比显得冗长。执行这个简单任务最简洁的方式是什么?

可能是julia选择数组/矩阵中除一个元素外的所有元素的重复问题。 - Colin T Bowers
嗯,问题有点相似,但那边的答案并不适用于这里。 - Michael K. Borregaard
可能是 如何通过引用从数组中弹出对象 的重复问题。 - Gnimuc
1
关于 A[-k] 语法,这个问题可能与此相关:https://dev59.com/QZ_ha4cB1Zd3GeqPxmCe - Gnimuc
2
为了完整起见,在k是索引数组而不是单个索引的情况下,您可以将列表推导式修改为[A[i] for i = 1:8 if i ∉ k](其中∉运算符可以通过键入\notin并按TAB键获得)。 - Tasos Papastylianou
5个回答

23

虽然不像 R 的等价语句那么简洁,但相当易读:

A[1:end .!= k]

更重要的是,这也可以用于多维数组中,例如:

B[  1:end .!= i,   1:end .!= j,   1:end .!= k  ]

啊,抱歉,刚看到这个答案和链接的帖子一样。但是为什么人们认为这不相关呢? - Tasos Papastylianou
1
因为我理解原始问题不仅仅是关于单个元素的。 - Michael K. Borregaard
啊,好的。是的,我想在那种情况下,人们可能需要调用 findin 或退回到列表推导等方法... - Tasos Papastylianou

11
最简单的方法是使用“Not”。
julia> using InvertedIndices # use ] add InvertedIndices if not installed

julia> A = [1,2,3,4,5,6,7,8]

julia> k = 4;

julia> A[Not(k)]
7-element Array{Int64,1}:
 1
 2
 3
 5
 6
 7
 8

这种方法相对于其他方法来说更有效还是不太有效?它与 deleteat! 相比如何? - Vass

8

请看deleteat!的示例:

julia> A = [1,2,3,4,5,6,7,8]; k = 4;

julia> deleteat!(A, k)
7-element Array{Int64,1}:
 1
 2
 3
 5
 6
 7
 8

julia> A = [1,2,3,4,5,6,7,8]; k = 2:2:8;

julia> deleteat!(A, k)
4-element Array{Int64,1}:
 1
 3
 5
 7

非常好。我忘记了 deleteat! - Michael K. Borregaard
不相关 - 它是否真的吃掉了被排除的元素? - Michael K. Borregaard
是的,然后将所有后续元素向前移动以填充。 - Alexander Morley
方便但通过引用修改数组,这不是我想要的(尽管在我的问题中可能没有表达清楚!) - Richard Border

5
您可以将filtereachindex结合使用。
julia> A = collect(1:8); println(A)        
[1, 2, 3, 4, 5, 6, 7, 8]                   

julia> A[ filter(x->!(x in [5,6]) && x>2, eachindex(A)) ]
4-element Array{Int64,1}:
 3
 4
 7
 8

如果你想对数组的每个维度应用一个过滤器,那么你需要使用 indices(A,n) 替换 eachindex(A),其中 n 是相应的维度,例如:

B[ filter(x->!(x  in [5,6])&&x>2, indices(B,1)), filter(x->x>3, indices(B,2)) ]

BenchmarkTools.@btime filter(...);似乎比其他的更快。 - Jason D
这应该是正确的答案,因为它涵盖了比仅删除单个索引更多的用例。也许可以在另一个问题中提问/回答? - Hansang

3

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