Julia中如何优雅实现向量条件筛选避免重复输入变量名
Julia中简化向量条件筛选赋值的方法
常规通过布尔索引筛选后重新赋值的写法需要重复3次变量名,当变量名较长时写法冗余:
# 常规写法,变量名position重复3次 position = position[position .< 4]
最简洁的原生实现方式是使用Julia内置的就地筛选函数filter!,仅需要输入1次变量名即可完成相同操作:
filter!是Julia Base内置的可变集合就地操作函数,函数名末尾的!表示它会直接修改传入的原集合,不需要额外重新赋值- 第一个参数传入筛选条件对应的谓词函数,第二个参数传入要操作的向量即可
针对简单比较类的筛选条件,可以利用Julia比较运算符的柯里化特性,直接写<(n)/>(n)/>=(n)这类形式作为谓词,写法非常简洁:
# 仅需写1次position,筛选保留所有小于4的元素,效果和原写法完全一致 filter!(<(4), position)
运行效果验证:
julia> position = [1,2,3,4,5] 5-element Vector{Int64}: 1 2 3 4 5 julia> filter!(<(4), position) 3-element Vector{Int64}: 1 2 3
如果筛选条件更复杂,无法直接用柯里化的比较运算符表达,可以直接传入匿名函数作为谓词,同样只需要写1次变量名:
# 例如保留满足x² + 2x > 10的元素 filter!(x -> x^2 + 2x > 10, position)
注意:
filter!是就地修改原数组,和原写法x = x[cond]重新绑定变量到新数组的语义有细微差别:如果原数组被其他变量引用,filter!的修改会同步反映到所有引用上,而原写法不会修改原数组,只是让当前变量指向新数组。如果需要完全匹配原写法的「创建新数组+重新绑定」语义,又不想重复输入变量名,可以借助自定义宏实现,但绝大多数需要把筛选结果赋值回原变量的场景下,filter!是性能更好、写法最简洁的选择。
内容的提问来源于stack exchange,提问作者Suvar
相关产品推荐
相关产品推荐

