Julia 朱莉娅:有没有办法返回索引中每个值的迭代器?
考虑Julia 朱莉娅:有没有办法返回索引中每个值的迭代器?,julia,Julia,考虑m=[1 2 3;4 5 6;7 8 9] for idx in eachindex(m) println(idx) end 我希望它能打印出(1,1)(2,1),(3,1)。。。。(1,3),(2,3),(3,3)但它会打印1,2,…,9 在多维数组的所有索引中循环最优雅的方法是什么?这不一定优雅,但它可以工作: for i in eachindex(view(m, 1:size(m)[1], 1:size(m)[2])) println(i) end Cartesi
m=[1 2 3;4 5 6;7 8 9]
for idx in eachindex(m)
println(idx)
end
我希望它能打印出(1,1)(2,1),(3,1)。。。。(1,3),(2,3),(3,3)
但它会打印1,2,…,9
在多维数组的所有索引中循环最优雅的方法是什么?这不一定优雅,但它可以工作:
for i in eachindex(view(m, 1:size(m)[1], 1:size(m)[2]))
println(i)
end
CartesianIndex(1, 1)
CartesianIndex(2, 1)
CartesianIndex(3, 1)
CartesianIndex(1, 2)
CartesianIndex(2, 2)
CartesianIndex(3, 2)
CartesianIndex(1, 3)
CartesianIndex(2, 3)
CartesianIndex(3, 3)
原因是数组
使用快速线性索引(范围1:length(m)
),但并非所有数组都使用,尤其是视图
不使用。那些数组使用笛卡尔指数。那怎么办
julia> for i in CartesianIndices(m)
println(Tuple(i))
end
(1, 1)
(2, 1)
(3, 1)
(1, 2)
(2, 2)
(3, 2)
(1, 3)
(2, 3)
(3, 3)
(您可以使用
tuple(i)
)访问i::CartseianIndex
的子索引元组)我为什么不这样做呢对于zip中的(i,j)(OneTo.(size(m))…)
我想您希望i
成为m
的实际索引。确切地说,eachindex
返回的内容取决于您对它的调用,以及对它最有效的方式。对于Array
,默认情况下这是LinearIndices
。对于视图,它是cartesianindice
。我认为编写Tuple(I)
可能比编写I.I
更好,因为访问字段依赖于类型的内部实现细节。如果实现发生变化,它可能会停止工作。哈,我知道!我首先尝试了tuple(I)
(使用非大写T
而不是类型的函数),但没有成功。谢谢你让我们知道。我相应地编辑了答案:)