Julia 将迭代器收集为二维数组

Julia 将迭代器收集为二维数组,julia,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)

我想创建一个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)
(0, 0, 0)
(1, 0, 0)
(0, 1, 0)
(1, 1, 0)
(0, 0, 1)
(1, 0, 1)
(0, 1, 1)
(1, 1, 1)
但是,在预期的

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

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)
(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矩阵?

您正在寻找类似的东西吗

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
请注意,在特定情况下,最终矩阵的行仅对应于从
0
2^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

你想得到哪个2d矩阵?一个2d矩阵,就像我在问题中打印的最后一个。是的,我试图生成一个二进制计数矩阵。实际上,我最关心的是行/元组,而不一定是一个合适的矩阵。但我也希望有一种适用于所有项目的方法。乘积,repeat的等价物是什么?
[a,b]表示[0,1]中的a,而[0,1]表示[0,1]中的b
[x表示乘积中的x(repeat([0,1]],3)]|>vec
,以获得元组向量。如果你想要一个向量向量,你可以做额外的步骤
collect.(flatte.(ans))
。或者作为一个丑陋的野兽:
collect.(flatte.(向量向量(collect)(产品(重复[0,1]],3)…))
,但实际上。。为什么?:)元组在以后的程序中似乎不起作用。不管怎样,你都帮了我。非常感谢。