如何在Julia中从CartesianIndex向量查找指定维度值的元素
解决方法
这里有几种比转矩阵用findall更简洁高效的实现方式,直接针对CartesianIndex向量操作:
方式一:用filter直接筛选
借助filter函数配合匿名函数,直接检查每个索引的第d个分量:
f(CI, d, k) = filter(ci -> ci[d] == k, CI)
测试效果和预期一致:
julia> CI = [CartesianIndex(1, 3, 1), CartesianIndex(1, 1, 4), CartesianIndex(2, 2, 3), CartesianIndex(1, 2, 4), CartesianIndex(1, 1, 1)] 5-element Vector{CartesianIndex{3}}: CartesianIndex(1, 3, 1) CartesianIndex(1, 1, 4) CartesianIndex(2, 2, 3) CartesianIndex(1, 2, 4) CartesianIndex(1, 1, 1) julia> f(CI,1,2) 1-element Vector{CartesianIndex{3}}: CartesianIndex(2, 2, 3) julia> f(CI,2,1) 2-element Vector{CartesianIndex{3}}: CartesianIndex(1, 1, 4) CartesianIndex(1, 1, 1)
方式二:数组推导式生成结果
用Julia的数组推导式语法,直接生成符合条件的元素向量,可读性很强:
f(CI, d, k) = [ci for ci in CI if ci[d] == k]
这个写法和filter效果完全一样,只是语法风格更偏向数组构造,看个人习惯选择。
方式三:广播+布尔索引(性能优先)
如果追求极致性能,可以先批量提取所有元素的第d分量,再用布尔掩码筛选原向量:
f(CI, d, k) = CI[getindex.(CI, d) .== k]
这种方式先通过getindex.(CI, d)广播提取所有第d分量的值,生成布尔数组后直接索引原向量,避免了额外的函数调用开销,适合处理大规模数据的场景。
优势说明
这些方法都不需要把CartesianIndex向量转成矩阵,直接操作原数据,既减少了内存消耗,又让代码更简洁直观,完全贴合Julia的数组操作习惯,性能也不比转矩阵的方法差。
内容的提问来源于stack exchange,提问作者Sakurai.JJ
相关产品推荐
相关产品推荐

