将迭代器收集为2D数组

时间:2019-12-07 09:52:35

标签: julia

我想创建2D二进制矩阵,但是Julia意外地使用了collect并给了我3D矩阵。

using Base.Iterators

collect(product(repeat([[0, 1]], 3)...))

输出

2×2×2 Array{Tuple{Int64,Int64,Int64},3}:
[:, :, 1] =
 (0, 0, 0)  (0, 1, 0)
 (1, 0, 0)  (1, 1, 0)

[:, :, 2] =
 (0, 0, 1)  (0, 1, 1)
 (1, 0, 1)  (1, 1, 1)

遍历未收集的结果,但按预期进行

for x in product(repeat([[0, 1]], 3)...)
    println(x)
end

输出

(0, 0, 0)
(1, 0, 0)
(0, 1, 0)
(1, 1, 0)
(0, 0, 1)
(1, 0, 1)
(0, 1, 1)
(1, 1, 1)

如何将迭代器的元组收集为2D矩阵?

1 个答案:

答案 0 :(得分:1)

您是否正在寻找类似的东西?

julia> X = product(repeat([[0, 1]], 3)...)
Base.Iterators.ProductIterator{Tuple{Array{Int64,1},Array{Int64,1},Array{Int64,1}}}(([0, 1], [0, 1], [0, 1]))

julia> X |> flatten |> collect |> x->reshape(x, (3,:))'
8×3 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 0  0  0
 1  0  0
 0  1  0
 1  1  0
 0  0  1
 1  0  1
 0  1  1
 1  1  1

请注意,在您的特定情况下,最终矩阵的行仅与从02^3-1 = 7的二进制计数相对应。您可以直接直接构造结果:

julia> reduce(vcat, digits.(0:7, base=2, pad=3)')
8×3 Array{Int64,2}:
 0  0  0
 1  0  0
 0  1  0
 1  1  0
 0  0  1
 1  0  1
 0  1  1
 1  1  1