生成两个数组组合的所有排列

tuc*_*son 6 julia

不知道标题是否正确,以下是一些解释:

# I have two arrays: segments and directions
k = 3
segments = collect(1:k)
directions = ["same","reversed"]

# I wish now to generate all possible ways to order the k segments, 
# given that each segment can be either in direction "same" or "reversed"
# so the results should look like:

[[1,"same"], [2,"same"], [3,"same"]]
[[1,"same"], [2,"same"], [3,"reversed"]]
[[1,"same"], [2,"reversed"], [3,"same"]]
[[1,"reversed"], [2,"same"], [3,"same"]]
[[1,"same"], [2,"reversed"], [3,"reversed"]]
...
[[2,"same"], [1,"same"], [3,"same"]]
[[2,"same"], [1,"same"], [3,"reversed"]]
...

# I have tried a few things like this (with no success):
using IterTools
collect(product(segments, directions))
Run Code Online (Sandbox Code Playgroud)

目标是每行覆盖三个部分,每个部分都有一个方向。

Bog*_*ski 6

这是一个初始答案(这是不正确的,因为我错误地理解了这个问题,请参阅下面的编辑以获得正确的答案)。

\n
\n

一种自然的方法是:

\n
julia> collect(Iterators.product(fill(directions, k)...))\n2\xc3\x972\xc3\x972 Array{Tuple{String, String, String}, 3}:\n[:, :, 1] =\n ("same", "same", "same")      ("same", "reversed", "same")\n ("reversed", "same", "same")  ("reversed", "reversed", "same")\n\n[:, :, 2] =\n ("same", "same", "reversed")      ("same", "reversed", "reversed")\n ("reversed", "same", "reversed")  ("reversed", "reversed", "reversed")\n
Run Code Online (Sandbox Code Playgroud)\n

因为您实际上并不需要这里的数字 1,2,3,因为它们是由索引编码的。在这种情况下,使用元组而不是向量应该会更有效。

\n

如果您想将它们相加并将结果转换为每个问题的向量向量,请执行以下操作:

\n
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)]\n2\xc3\x972\xc3\x972 Array{Vector{Vector{Any}}, 3}:\n[:, :, 1] =\n [[1, "same"], [2, "same"], [3, "same"]]      [[1, "same"], [2, "reversed"], [3, "same"]]\n [[1, "reversed"], [2, "same"], [3, "same"]]  [[1, "reversed"], [2, "reversed"], [3, "same"]]\n\n[:, :, 2] =\n [[1, "same"], [2, "same"], [3, "reversed"]]      [[1, "same"], [2, "reversed"], [3, "reversed"]]\n [[1, "reversed"], [2, "same"], [3, "reversed"]]  [[1, "reversed"], [2, "reversed"], [3, "reversed"]]\n
Run Code Online (Sandbox Code Playgroud)\n

最后,如果你想要一个向量,那么:

\n
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)] |> vec\n8-element Vector{Vector{Vector{Any}}}:\n [[1, "same"], [2, "same"], [3, "same"]]\n [[1, "reversed"], [2, "same"], [3, "same"]]\n [[1, "same"], [2, "reversed"], [3, "same"]]\n [[1, "reversed"], [2, "reversed"], [3, "same"]]\n [[1, "same"], [2, "same"], [3, "reversed"]]\n [[1, "reversed"], [2, "same"], [3, "reversed"]]\n [[1, "same"], [2, "reversed"], [3, "reversed"]]\n [[1, "reversed"], [2, "reversed"], [3, "reversed"]]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

编辑

\n

这就是你想要的吗:

\n
julia> using Combinatorics\n\njulia> x1 = permutations(segments)\nCombinatorics.Permutations{Vector{Int64}}([1, 2, 3], 3)\n\njulia> x2 = Iterators.product(fill(directions, k)...)\nBase.Iterators.ProductIterator{Tuple{Vector{String}, Vector{String}, Vector{String}}}((["same", "reversed"], ["same", "reversed"], ["same", "reversed"]))\n\njulia> [vcat.(v...) for v in Iterators.product(x1, x2)]\n6\xc3\x972\xc3\x972\xc3\x972 Array{Vector{Vector{Any}}, 4}:\n[:, :, 1, 1] =\n [[1, "same"], [2, "same"], [3, "same"]]  [[1, "reversed"], [2, "same"], [3, "same"]]\n [[1, "same"], [3, "same"], [2, "same"]]  [[1, "reversed"], [3, "same"], [2, "same"]]\n [[2, "same"], [1, "same"], [3, "same"]]  [[2, "reversed"], [1, "same"], [3, "same"]]\n [[2, "same"], [3, "same"], [1, "same"]]  [[2, "reversed"], [3, "same"], [1, "same"]]\n [[3, "same"], [1, "same"], [2, "same"]]  [[3, "reversed"], [1, "same"], [2, "same"]]\n [[3, "same"], [2, "same"], [1, "same"]]  [[3, "reversed"], [2, "same"], [1, "same"]]\n\n[:, :, 2, 1] =\n [[1, "same"], [2, "reversed"], [3, "same"]]  [[1, "reversed"], [2, "reversed"], [3, "same"]]\n [[1, "same"], [3, "reversed"], [2, "same"]]  [[1, "reversed"], [3, "reversed"], [2, "same"]]\n [[2, "same"], [1, "reversed"], [3, "same"]]  [[2, "reversed"], [1, "reversed"], [3, "same"]]\n [[2, "same"], [3, "reversed"], [1, "same"]]  [[2, "reversed"], [3, "reversed"], [1, "same"]]\n [[3, "same"], [1, "reversed"], [2, "same"]]  [[3, "reversed"], [1, "reversed"], [2, "same"]]\n [[3, "same"], [2, "reversed"], [1, "same"]]  [[3, "reversed"], [2, "reversed"], [1, "same"]]\n\n[:, :, 1, 2] =\n [[1, "same"], [2, "same"], [3, "reversed"]]  [[1, "reversed"], [2, "same"], [3, "reversed"]]\n [[1, "same"], [3, "same"], [2, "reversed"]]  [[1, "reversed"], [3, "same"], [2, "reversed"]]\n [[2, "same"], [1, "same"], [3, "reversed"]]  [[2, "reversed"], [1, "same"], [3, "reversed"]]\n [[2, "same"], [3, "same"], [1, "reversed"]]  [[2, "reversed"], [3, "same"], [1, "reversed"]]\n [[3, "same"], [1, "same"], [2, "reversed"]]  [[3, "reversed"], [1, "same"], [2, "reversed"]]\n [[3, "same"], [2, "same"], [1, "reversed"]]  [[3, "reversed"], [2, "same"], [1, "reversed"]]\n\n[:, :, 2, 2] =\n [[1, "same"], [2, "reversed"], [3, "reversed"]]  [[1, "reversed"], [2, "reversed"], [3, "reversed"]]\n [[1, "same"], [3, "reversed"], [2, "reversed"]]  [[1, "reversed"], [3, "reversed"], [2, "reversed"]]\n [[2, "same"], [1, "reversed"], [3, "reversed"]]  [[2, "reversed"], [1, "reversed"], [3, "reversed"]]\n [[2, "same"], [3, "reversed"], [1, "reversed"]]  [[2, "reversed"], [3, "reversed"], [1, "reversed"]]\n [[3, "same"], [1, "reversed"], [2, "reversed"]]  [[3, "reversed"], [1, "reversed"], [2, "reversed"]]\n [[3, "same"], [2, "reversed"], [1, "reversed"]]  [[3, "reversed"], [2, "reversed"], [1, "reversed"]]\n
Run Code Online (Sandbox Code Playgroud)\n