Julia中是否有枚举数组索引的Base原生方法?是否应添加indices至标准库?
问题背景与提问
在Julia中,有时需要遍历数组的多维索引,例如创建带噪声的乘法表:
首先生成噪声矩阵:
julia> m = 0.1*rand(2,3) 2×3 Matrix{Float64}: 0.0692654 0.0297861 0.0642931 0.0187022 0.0530222 0.0561437
接着通过自定义函数indices生成带噪声的乘法表:
julia> indices(A) = Iterators.map(Tuple, CartesianIndices(A)) indices (generic function with 1 method) julia> noisy_mult = [i*j+m[i,j] for (i,j) in indices(m)] 2×3 Matrix{Float64}: 1.06927 2.02979 3.06429 2.0187 4.05302 6.05614
提问:Base库中是否有等效于indices的原生方法,或更简便的实现方式?将indices纳入标准库是否合理?
等效方法与简便实现
Base库中不需要额外定义indices函数,有两种更直接的实现方式:
方式1:直接遍历CartesianIndices并解构
Julia支持直接将CartesianIndex对象解构为多维索引元组,因此可以直接遍历CartesianIndices(m),无需额外转换:
noisy_mult = [i*j + m[i,j] for (i,j) in CartesianIndices(m)]
或者保留CartesianIndex对象直接使用,写法更紧凑:
noisy_mult = [I[1]*I[2] + m[I] for I in CartesianIndices(m)]
方式2:遍历数组的轴(axes)
利用axes函数直接获取每个维度的索引范围,通过嵌套生成式实现:
noisy_mult = [i*j + m[i,j] for i in axes(m,1), j in axes(m,2)]
这种写法直观易懂,适合明确需要按维度遍历的场景。
是否需要将indices纳入标准库?
不需要,理由如下:
- 已有更简洁的原生写法:直接使用
CartesianIndices配合解构或axes遍历,代码量和自定义函数相当,甚至更灵活; - Julia的设计理念:标准库倾向于提供底层、通用的工具(如
CartesianIndices),而非封装特定场景的小函数,避免API冗余; - 自定义成本极低:如果确实有频繁使用的需求,用户可以自行定义该函数,无需内置到标准库中。
内容的提问来源于stack exchange,提问作者Dan Getz
相关产品推荐
相关产品推荐

