如何在Julia中根据函数对向量进行拆分?
Julia中按条件拆分向量的高效实现方案
Base标准库中并没有直接提供像你描述的partition(f, v)这样的现成函数,但可以通过Base自带工具组合出高效实现,或是写出性能媲美库函数的手动实现:
1. 最简洁的实现(两次遍历)
利用filter分别筛选符合和不符合条件的元素,写法直观易懂:
f = iseven v = [1,2,3] (filter(f, v), filter(!f, v)) # 返回 ([2], [1, 3])
这种方式的优势是代码简洁,对于常规规模的向量,性能完全够用,唯一的不足是会对向量进行两次遍历。
2. 高效一次遍历实现
如果处理超大向量,追求极致性能,可以手动实现一次遍历的版本——Julia的原生循环效率极高,和Base库函数的性能处于同一水平:
function partition(f, v) yes = eltype(v)[] no = eltype(v)[] # 预分配内存,避免动态扩容开销 sizehint!(yes, length(v)) sizehint!(no, length(v)) for x in v f(x) ? push!(yes, x) : push!(no, x) end yes, no end # 调用示例 partition(iseven, [1,2,3]) # 返回 ([2], [1, 3])
3. 基于索引的实现
如果你已经通过findall获取了符合条件的索引,可以直接用索引拆分向量:
f = iseven v = [1,2,3] idx = findall(f, v) (v[idx], v[setdiff(eachindex(v), idx)])
这种方式的性能介于前两者之间,适合已经有索引需求的场景,但setdiff操作会带来额外的开销。
内容的提问来源于stack exchange,提问作者Davi Barreira
相关产品推荐
相关产品推荐

