Julia中如何实现NumPy式的逐元素多维数组索引?
等价于NumPy逐元素索引的Julia实现方案
核心差异说明
两类语言的索引默认逻辑存在本质区别:
- NumPy 传入多个同长度一维索引数组时,会按逐元素配对规则取数,依次访问
(第一组索引第1个值, 第二组索引第1个值)、(第一组索引第2个值, 第二组索引第2个值)对应的坐标 - Julia 传入多个数组作为索引时,默认走笛卡尔积排列逻辑,会取所有维度索引的组合坐标,因此传入
A[[1,2],[1,2]]时,会依次取遍(1,1)、(1,2)、(2,1)、(2,2)四个坐标,拼出完整的2x2矩阵
无循环简洁实现
不需要手写for循环,两种通用高效写法可实现和NumPy完全一致的效果,适配任意维度数组、任意数量的同长度索引数组:
- 逐元素生成
CartesianIndex作为索引
以示例矩阵A = [1 2; 3 4]、行索引数组row_idx = [1,2]、列索引数组col_idx = [1,2]为例,写法为A[CartesianIndex.(row_idx, col_idx)]
运行后直接返回[1, 4],和NumPy结果完全一致。这种写法是Julia的标准高性能实现,无动态循环开销,性能和原生底层实现对齐。 - 广播版
getindex实现
等价写法为getindex.(Ref(A), row_idx, col_idx),效果和上述CartesianIndex写法完全相同。
拓展说明
这套写法不受数组维度限制,无论数组是3维、4维还是更高维度,只要把各维度的索引数组按顺序传入对应方法,就能自动实现逐元素配对的访问逻辑。如果某一维度需要固定取单个值,不需要刻意将其拓展为和其他索引数组等长的序列,写法比NumPy更灵活。
内容的提问来源于stack exchange,提问作者Lödrik
相关产品推荐
相关产品推荐

