You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:12:46