获取包含给定元素的所有组合的数组的最优雅的方法

Ant*_*rev 4 combinations julia

当前获取列名包含给定元素的所有组合的数组的最优雅的方法是什么?R 中的函数的一些最接近的类似物。expand.grid()我在这个问题上遇到的所有讨论都是关于问题的稍微不同的表述,或者是在 Julia 的非常旧版本的时代进行的。目前我发现的最合理的解决方案如下:

using DataFrames
xy = [[x,y] for x in 0:0.25:1 for y in 0:0.25:1]
xy_array = permutedims(reshape(hcat(xy...), (length(xy[1]), length(xy))))
df = DataFrame(x = xy_array[:,1], y = xy_array[:,2])
Run Code Online (Sandbox Code Playgroud)

R 中的类似表达式可以写得更紧凑:

xy_comb <- expand.grid(x=seq(0, 1, 0.25), y=seq(0, 1, 0.25))
Run Code Online (Sandbox Code Playgroud)

在 Julia 中是否有更简洁的形式来编写相同的表达式?

Bog*_*ski 5

让我展示几个选项,这些选项还将展示 DataFrames.jl 与 Tables.jl 的集成以及如何在本例中使用它。

\n

你可以这样做:

\n
julia> df = DataFrame(x=Float64[], y=Float64[])\n0\xc3\x972 DataFrame\n\njulia> foreach(x -> push!(df, x), Iterators.product(0:0.25:1, 0:0.25:1))\n\njulia> df\n25\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82    0.0      0.0\n   2 \xe2\x94\x82    0.25     0.0\n   3 \xe2\x94\x82    0.5      0.0\n  \xe2\x8b\xae  \xe2\x94\x82    \xe2\x8b\xae        \xe2\x8b\xae\n  23 \xe2\x94\x82    0.5      1.0\n  24 \xe2\x94\x82    0.75     1.0\n  25 \xe2\x94\x82    1.0      1.0\n         19 rows omitted\n
Run Code Online (Sandbox Code Playgroud)\n

或这个(这会更快,但是当您动态生成数据帧的行时,前一种模式在一般情况下很有用):

\n
julia> rename!(DataFrame(Iterators.product(0:0.25:1, 0:0.25:1)), [:x, :y])\n25\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82    0.0      0.0\n   2 \xe2\x94\x82    0.25     0.0\n   3 \xe2\x94\x82    0.5      0.0\n  \xe2\x8b\xae  \xe2\x94\x82    \xe2\x8b\xae        \xe2\x8b\xae\n  23 \xe2\x94\x82    0.5      1.0\n  24 \xe2\x94\x82    0.75     1.0\n  25 \xe2\x94\x82    1.0      1.0\n         19 rows omitted\n
Run Code Online (Sandbox Code Playgroud)\n

问题DataFrame(Iterators.product(0:0.25:1, 0:0.25:1))是默认的列名称是"1"并且"2"您可能想要更改。

\n

因此你也可以生成NamedTuples而不是Tuples像这样:

\n
julia> DataFrame((x=x,y=y) for x in 0:0.25:1 for y in 0:0.25:1)\n25\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82    0.0      0.0\n   2 \xe2\x94\x82    0.0      0.25\n   3 \xe2\x94\x82    0.0      0.5\n  \xe2\x8b\xae  \xe2\x94\x82    \xe2\x8b\xae        \xe2\x8b\xae\n  23 \xe2\x94\x82    1.0      0.5\n  24 \xe2\x94\x82    1.0      0.75\n  25 \xe2\x94\x82    1.0      1.0\n         19 rows omitted\n
Run Code Online (Sandbox Code Playgroud)\n

具有不同的行顺序。

\n