如何在Julia中按值从数组中删除元素?

如何在Julia中按值从数组中删除元素?,julia,Julia,我在Julia有一个简单的程序: a = [1, 2, 3, 10, 20, 30] delete!(a, 10) 但它不起作用。错误是MethodError:没有与删除匹配的方法!(::数组{Int64,1},::Int64) 我可以看到deleteat和拼接接受索引而不是值 如何从Julia中的数组a中删除元素10?使用过滤器用于过滤值10的函数。≠(键入\ne并按选项卡)就可以使用了 julia> a = [1, 2, 3, 10, 20, 30] 6-element Array{

我在Julia有一个简单的程序:

a = [1, 2, 3, 10, 20, 30]
delete!(a, 10)
但它不起作用。错误是
MethodError:没有与删除匹配的方法!(::数组{Int64,1},::Int64)

我可以看到
deleteat
拼接接受索引而不是值


如何从Julia中的数组
a
中删除元素
10

使用
过滤器用于过滤值
10
的函数。
(键入
\ne
并按
选项卡
)就可以使用了

julia> a = [1, 2, 3, 10, 20, 30]
6-element Array{Int64,1}:
  1
  2
  3
 10
 20
 30

julia> filter!(x->x≠10,a)
5-element Array{Int64,1}:
  1
  2
  3
 20
 30

julia>
如果阵列中有多个10,该解决方案甚至可以工作

julia> a = [1,10,10]
3-element Array{Int64,1}:
  1
 10
 10

julia> filter!(x->x≠10,a)
1-element Array{Int64,1}:
 1

deleteat

deleteat!(a::矢量,inds)

删除
inds
给出的索引处的项目,并返回修改后的
a
。随后的项目被转移以填补产生的空白

inds
可以是迭代器,也可以是已排序且唯一的整数索引的集合,或者是长度与
a
相同的布尔向量,其中true表示要删除的条目

(我的重点)

也就是说,您可以简单地测试(elementwise)相等性,并像普通数组一样将其用于“布尔索引”:

deleteat!(a, a .== 10);


PS:或者如果您只想删除第一个:deleteat!(a,findfirst(a==10))

是要删除数组中的元素
10
,还是要删除值为
10
的元素?这不是一回事吗?我希望数组是
a=[1,2,3,20,30]
。您希望如何处理多个事件?要删除所有
10
s,可以使用
filter!(x->x!=10,a)
。假设我没有多次出现。
(idx=findfirst(a,10))>0?删除!(a,idx):a
也是一个选项(当
10
只出现一次时有效。当然,
10
应该被一个变量替换成一个函数。
过滤器!
解决方案会更清晰。只需再次注意,
deleteat!(a,findfirst(a,10))
快了30%,但只适用于删除等于10的第一个元素(如果没有这样的元素,则会出现错误,但这是可以修复的)。它可能与关键代码部分相关。如果您只想删除元素的一个实例,而不是所有实例,那么它也很有用。语法也已更改,您现在需要使用
findfirst(x->x==10,a)
。谓词函数构造的开销可能并不小,因此除了在第一次出现后提前中断循环外,这还可以解释一些性能差异。