【问题标题】:Exclude elements of Array based on index (Julia)根据索引排除 Array 的元素 (Julia)
【发布时间】:2018-03-07 02:52:13
【问题描述】:

在 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] 相比显得冗长。执行这个简单任务的最简洁的方法是什么?

【问题讨论】:

标签: arrays subset julia


【解决方案1】:

最简单的方法是使用“不”。

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

【讨论】:

    【解决方案2】:

    我认为这个问题值得更新。现在有一个专门用于此目的的软件包:

    https://github.com/mbauman/InvertedIndices.jl

    【讨论】:

      【解决方案3】:

      您可以将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
      

      如果对数组的每个维度应用过滤器,则需要将eachindex(A) 替换为indices(A,n),其中n 是适当的维度,例如

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

      【讨论】:

      • BenchmarkTools.@btime filter(...);似乎比其他人更快
      • 这应该是正确的答案,因为它涵盖的用例远不止删除单个索引。也许在一个单独的问题中提问/回答?
      【解决方案4】:

      不像 R 的等价物那样简洁,但相当易读:

      A[1:end .!= k]
      

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

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

      【讨论】:

      • 啊,抱歉,刚刚看到这与链接帖子的答案相同。为什么人们认为这无关紧要?
      • 因为我将最初的问题解释为不止一个元素。
      • 啊,很公平。是的,我想在这种情况下必须调用findin 或退回到列表理解等...
      【解决方案5】:

      看看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!
      • 不相关 - 它真的吃掉了排除的元素吗?
      • 是的,然后将所有以下元素向前移动以填充我认为。
      • 方便,但通过引用修改数组,这不是我的想法(尽管我的问题可能不清楚!)
      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2017-12-12
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多