如何修改Julia代码,基于数组或集合生成元组笛卡尔积
元素集合的笛卡尔积生成
我有一段Julia代码,用于生成每个位置包含3种可能元素的所有4元组:
julia> collect(Iterators.product(ntuple(_ -> 1:3, 4)...)) 3×3×3×3 Array{NTuple{4, Int64}, 4}: [:, :, 1, 1] = (1, 1, 1, 1) (1, 2, 1, 1) (1, 3, 1, 1) (2, 1, 1, 1) (2, 2, 1, 1) (2, 3, 1, 1) (3, 1, 1, 1) (3, 2, 1, 1) (3, 3, 1, 1) [:, :, 2, 1] = (1, 1, 2, 1) (1, 2, 2, 1) (1, 3, 2, 1) (2, 1, 2, 1) (2, 2, 2, 1) (2, 3, 2, 1) (3, 1, 2, 1) (3, 2, 2, 1) (3, 3, 2, 1) [:, :, 3, 1] = (1, 1, 3, 1) (1, 2, 3, 1) (1, 3, 3, 1) (2, 1, 3, 1) (2, 2, 3, 1) (2, 3, 3, 1) (3, 1, 3, 1) (3, 2, 3, 1) (3, 3, 3, 1) [:, :, 1, 2] = (1, 1, 1, 2) (1, 2, 1, 2) (1, 3, 1, 2) (2, 1, 1, 2) (2, 2, 1, 2) (2, 3, 1, 2) (3, 1, 1, 2) (3, 2, 1, 2) (3, 3, 1, 2) ...
问题
如何修改这段代码,将元素来源从范围1:3替换为数组(例如[1,5])或集合(例如Set([1,5])),每个位置仅提供2种选择?
解决方案
直接将ntuple里的1:3替换为你需要的数组或集合即可,Iterators.product支持任何可迭代对象作为输入:
1. 使用数组作为元素来源
把1:3换成[1,5],代码如下:
julia> collect(Iterators.product(ntuple(_ -> [1,5], 4)...)) 2×2×2×2 Array{NTuple{4, Int64}, 4}: [:, :, 1, 1] = (1, 1, 1, 1) (1, 5, 1, 1) (5, 1, 1, 1) (5, 5, 1, 1) [:, :, 2, 1] = (1, 1, 5, 1) (1, 5, 5, 1) (5, 1, 5, 1) (5, 5, 5, 1) [:, :, 1, 2] = (1, 1, 1, 5) (1, 5, 1, 5) (5, 1, 1, 5) (5, 5, 1, 5) [:, :, 2, 2] = (1, 1, 5, 5) (1, 5, 5, 5) (5, 1, 5, 5) (5, 5, 5, 5)
2. 使用集合作为元素来源
直接传入Set([1,5])即可,但需要注意集合是无序的,每次运行生成的元组顺序可能不同:
julia> collect(Iterators.product(ntuple(_ -> Set([1,5]), 4)...)) 2×2×2×2 Array{NTuple{4, Int64}, 4}: [:, :, 1, 1] = (5, 5, 5, 5) (5, 1, 5, 5) (1, 5, 5, 5) (1, 1, 5, 5) # 后续输出会因Set的无序性有所变化
如果需要固定的元素顺序,建议直接定义有序数组[1,5];若必须基于集合,可先将集合转换为数组,但转换后的数组顺序仍不保证固定,需自行排序。
内容的提问来源于stack exchange,提问作者kfmfe04
相关产品推荐
相关产品推荐

