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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:05:27