生成两个数组组合的所有排列
Generate all permutations of the combination of two arrays
我不确定标题是否正确,以下是一些解释:
# 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))
objective是每一行覆盖三段,每段只有一个方向。
这是一个初始答案(这是不正确的,因为我错误地理解了这个问题,请参阅下面的编辑以获得更正的答案)。
一个自然的方法是:
julia> collect(Iterators.product(fill(directions, k)...))
2×2×2 Array{Tuple{String, String, String}, 3}:
[:, :, 1] =
("same", "same", "same") ("same", "reversed", "same")
("reversed", "same", "same") ("reversed", "reversed", "same")
[:, :, 2] =
("same", "same", "reversed") ("same", "reversed", "reversed")
("reversed", "same", "reversed") ("reversed", "reversed", "reversed")
因为您在这里并不真正需要数字 1、2、3,因为它们是由索引编码的。在这种情况下,使用元组而不是向量应该更有效。
如果您想将它们相加并将结果转换为每个问题的向量向量,请执行以下操作:
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)]
2×2×2 Array{Vector{Vector{Any}}, 3}:
[:, :, 1] =
[[1, "same"], [2, "same"], [3, "same"]] [[1, "same"], [2, "reversed"], [3, "same"]]
[[1, "reversed"], [2, "same"], [3, "same"]] [[1, "reversed"], [2, "reversed"], [3, "same"]]
[:, :, 2] =
[[1, "same"], [2, "same"], [3, "reversed"]] [[1, "same"], [2, "reversed"], [3, "reversed"]]
[[1, "reversed"], [2, "same"], [3, "reversed"]] [[1, "reversed"], [2, "reversed"], [3, "reversed"]]
最后,如果你想要一个向量,那么做:
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)] |> vec
8-element Vector{Vector{Vector{Any}}}:
[[1, "same"], [2, "same"], [3, "same"]]
[[1, "reversed"], [2, "same"], [3, "same"]]
[[1, "same"], [2, "reversed"], [3, "same"]]
[[1, "reversed"], [2, "reversed"], [3, "same"]]
[[1, "same"], [2, "same"], [3, "reversed"]]
[[1, "reversed"], [2, "same"], [3, "reversed"]]
[[1, "same"], [2, "reversed"], [3, "reversed"]]
[[1, "reversed"], [2, "reversed"], [3, "reversed"]]
编辑
这就是你想要的吗:
julia> using Combinatorics
julia> x1 = permutations(segments)
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3], 3)
julia> x2 = Iterators.product(fill(directions, k)...)
Base.Iterators.ProductIterator{Tuple{Vector{String}, Vector{String}, Vector{String}}}((["same", "reversed"], ["same", "reversed"], ["same", "reversed"]))
julia> [vcat.(v...) for v in Iterators.product(x1, x2)]
6×2×2×2 Array{Vector{Vector{Any}}, 4}:
[:, :, 1, 1] =
[[1, "same"], [2, "same"], [3, "same"]] [[1, "reversed"], [2, "same"], [3, "same"]]
[[1, "same"], [3, "same"], [2, "same"]] [[1, "reversed"], [3, "same"], [2, "same"]]
[[2, "same"], [1, "same"], [3, "same"]] [[2, "reversed"], [1, "same"], [3, "same"]]
[[2, "same"], [3, "same"], [1, "same"]] [[2, "reversed"], [3, "same"], [1, "same"]]
[[3, "same"], [1, "same"], [2, "same"]] [[3, "reversed"], [1, "same"], [2, "same"]]
[[3, "same"], [2, "same"], [1, "same"]] [[3, "reversed"], [2, "same"], [1, "same"]]
[:, :, 2, 1] =
[[1, "same"], [2, "reversed"], [3, "same"]] [[1, "reversed"], [2, "reversed"], [3, "same"]]
[[1, "same"], [3, "reversed"], [2, "same"]] [[1, "reversed"], [3, "reversed"], [2, "same"]]
[[2, "same"], [1, "reversed"], [3, "same"]] [[2, "reversed"], [1, "reversed"], [3, "same"]]
[[2, "same"], [3, "reversed"], [1, "same"]] [[2, "reversed"], [3, "reversed"], [1, "same"]]
[[3, "same"], [1, "reversed"], [2, "same"]] [[3, "reversed"], [1, "reversed"], [2, "same"]]
[[3, "same"], [2, "reversed"], [1, "same"]] [[3, "reversed"], [2, "reversed"], [1, "same"]]
[:, :, 1, 2] =
[[1, "same"], [2, "same"], [3, "reversed"]] [[1, "reversed"], [2, "same"], [3, "reversed"]]
[[1, "same"], [3, "same"], [2, "reversed"]] [[1, "reversed"], [3, "same"], [2, "reversed"]]
[[2, "same"], [1, "same"], [3, "reversed"]] [[2, "reversed"], [1, "same"], [3, "reversed"]]
[[2, "same"], [3, "same"], [1, "reversed"]] [[2, "reversed"], [3, "same"], [1, "reversed"]]
[[3, "same"], [1, "same"], [2, "reversed"]] [[3, "reversed"], [1, "same"], [2, "reversed"]]
[[3, "same"], [2, "same"], [1, "reversed"]] [[3, "reversed"], [2, "same"], [1, "reversed"]]
[:, :, 2, 2] =
[[1, "same"], [2, "reversed"], [3, "reversed"]] [[1, "reversed"], [2, "reversed"], [3, "reversed"]]
[[1, "same"], [3, "reversed"], [2, "reversed"]] [[1, "reversed"], [3, "reversed"], [2, "reversed"]]
[[2, "same"], [1, "reversed"], [3, "reversed"]] [[2, "reversed"], [1, "reversed"], [3, "reversed"]]
[[2, "same"], [3, "reversed"], [1, "reversed"]] [[2, "reversed"], [3, "reversed"], [1, "reversed"]]
[[3, "same"], [1, "reversed"], [2, "reversed"]] [[3, "reversed"], [1, "reversed"], [2, "reversed"]]
[[3, "same"], [2, "reversed"], [1, "reversed"]] [[3, "reversed"], [2, "reversed"], [1, "reversed"]]
我不确定标题是否正确,以下是一些解释:
# 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))
objective是每一行覆盖三段,每段只有一个方向。
这是一个初始答案(这是不正确的,因为我错误地理解了这个问题,请参阅下面的编辑以获得更正的答案)。
一个自然的方法是:
julia> collect(Iterators.product(fill(directions, k)...))
2×2×2 Array{Tuple{String, String, String}, 3}:
[:, :, 1] =
("same", "same", "same") ("same", "reversed", "same")
("reversed", "same", "same") ("reversed", "reversed", "same")
[:, :, 2] =
("same", "same", "reversed") ("same", "reversed", "reversed")
("reversed", "same", "reversed") ("reversed", "reversed", "reversed")
因为您在这里并不真正需要数字 1、2、3,因为它们是由索引编码的。在这种情况下,使用元组而不是向量应该更有效。
如果您想将它们相加并将结果转换为每个问题的向量向量,请执行以下操作:
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)]
2×2×2 Array{Vector{Vector{Any}}, 3}:
[:, :, 1] =
[[1, "same"], [2, "same"], [3, "same"]] [[1, "same"], [2, "reversed"], [3, "same"]]
[[1, "reversed"], [2, "same"], [3, "same"]] [[1, "reversed"], [2, "reversed"], [3, "same"]]
[:, :, 2] =
[[1, "same"], [2, "same"], [3, "reversed"]] [[1, "same"], [2, "reversed"], [3, "reversed"]]
[[1, "reversed"], [2, "same"], [3, "reversed"]] [[1, "reversed"], [2, "reversed"], [3, "reversed"]]
最后,如果你想要一个向量,那么做:
julia> [vcat.(1:k, x) for x in Iterators.product(fill(directions, k)...)] |> vec
8-element Vector{Vector{Vector{Any}}}:
[[1, "same"], [2, "same"], [3, "same"]]
[[1, "reversed"], [2, "same"], [3, "same"]]
[[1, "same"], [2, "reversed"], [3, "same"]]
[[1, "reversed"], [2, "reversed"], [3, "same"]]
[[1, "same"], [2, "same"], [3, "reversed"]]
[[1, "reversed"], [2, "same"], [3, "reversed"]]
[[1, "same"], [2, "reversed"], [3, "reversed"]]
[[1, "reversed"], [2, "reversed"], [3, "reversed"]]
编辑
这就是你想要的吗:
julia> using Combinatorics
julia> x1 = permutations(segments)
Combinatorics.Permutations{Vector{Int64}}([1, 2, 3], 3)
julia> x2 = Iterators.product(fill(directions, k)...)
Base.Iterators.ProductIterator{Tuple{Vector{String}, Vector{String}, Vector{String}}}((["same", "reversed"], ["same", "reversed"], ["same", "reversed"]))
julia> [vcat.(v...) for v in Iterators.product(x1, x2)]
6×2×2×2 Array{Vector{Vector{Any}}, 4}:
[:, :, 1, 1] =
[[1, "same"], [2, "same"], [3, "same"]] [[1, "reversed"], [2, "same"], [3, "same"]]
[[1, "same"], [3, "same"], [2, "same"]] [[1, "reversed"], [3, "same"], [2, "same"]]
[[2, "same"], [1, "same"], [3, "same"]] [[2, "reversed"], [1, "same"], [3, "same"]]
[[2, "same"], [3, "same"], [1, "same"]] [[2, "reversed"], [3, "same"], [1, "same"]]
[[3, "same"], [1, "same"], [2, "same"]] [[3, "reversed"], [1, "same"], [2, "same"]]
[[3, "same"], [2, "same"], [1, "same"]] [[3, "reversed"], [2, "same"], [1, "same"]]
[:, :, 2, 1] =
[[1, "same"], [2, "reversed"], [3, "same"]] [[1, "reversed"], [2, "reversed"], [3, "same"]]
[[1, "same"], [3, "reversed"], [2, "same"]] [[1, "reversed"], [3, "reversed"], [2, "same"]]
[[2, "same"], [1, "reversed"], [3, "same"]] [[2, "reversed"], [1, "reversed"], [3, "same"]]
[[2, "same"], [3, "reversed"], [1, "same"]] [[2, "reversed"], [3, "reversed"], [1, "same"]]
[[3, "same"], [1, "reversed"], [2, "same"]] [[3, "reversed"], [1, "reversed"], [2, "same"]]
[[3, "same"], [2, "reversed"], [1, "same"]] [[3, "reversed"], [2, "reversed"], [1, "same"]]
[:, :, 1, 2] =
[[1, "same"], [2, "same"], [3, "reversed"]] [[1, "reversed"], [2, "same"], [3, "reversed"]]
[[1, "same"], [3, "same"], [2, "reversed"]] [[1, "reversed"], [3, "same"], [2, "reversed"]]
[[2, "same"], [1, "same"], [3, "reversed"]] [[2, "reversed"], [1, "same"], [3, "reversed"]]
[[2, "same"], [3, "same"], [1, "reversed"]] [[2, "reversed"], [3, "same"], [1, "reversed"]]
[[3, "same"], [1, "same"], [2, "reversed"]] [[3, "reversed"], [1, "same"], [2, "reversed"]]
[[3, "same"], [2, "same"], [1, "reversed"]] [[3, "reversed"], [2, "same"], [1, "reversed"]]
[:, :, 2, 2] =
[[1, "same"], [2, "reversed"], [3, "reversed"]] [[1, "reversed"], [2, "reversed"], [3, "reversed"]]
[[1, "same"], [3, "reversed"], [2, "reversed"]] [[1, "reversed"], [3, "reversed"], [2, "reversed"]]
[[2, "same"], [1, "reversed"], [3, "reversed"]] [[2, "reversed"], [1, "reversed"], [3, "reversed"]]
[[2, "same"], [3, "reversed"], [1, "reversed"]] [[2, "reversed"], [3, "reversed"], [1, "reversed"]]
[[3, "same"], [1, "reversed"], [2, "reversed"]] [[3, "reversed"], [1, "reversed"], [2, "reversed"]]
[[3, "same"], [2, "reversed"], [1, "reversed"]] [[3, "reversed"], [2, "reversed"], [1, "reversed"]]