根据索引排除数组元素(Julia)

时间:2017-09-26 02:38:34

标签: arrays subset julia

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

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

[getindex(A, i) for i = 1:8 if i != k]

上述工作有效,但与A[-k]中提供的简单R相比似乎比较冗长。什么是执行这项简单任务最干净的方法?

5 个答案:

答案 0 :(得分:10)

不像R等同,但相当可读:

A[1:end .!= k]

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

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

答案 1 :(得分:7)

看看deleteat!。例子: 朱莉娅> A = [1,2,3,4,5,6,7,8]; k = 4; 朱莉娅>删除!(A,k) 7元素数组{Int64,1}:  1  2  3  五  6  7  8 朱莉娅> A = [1,2,3,4,5,6,7,8]; k = 2:2:8; 朱莉娅>删除!(A,k) 4元素数组{Int64,1}:  1  3  五  7

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

最简单的方法是使用“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

答案 4 :(得分:0)

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