将JULIA中的元组向量转换为数组

7

我对Julia不太熟悉,我正在尝试将一个元组向量转换为数组。 以下是一个例子:

using Statistics
a = randn((10, 100))
q = (0.05, 0.95)
conf_intervals = [quantile(a[i,:], q) for i in 1:10]

conf_intervals是一个10元组{Float64, Float64}的Vector

预期结果应该是一个10×2的Matrix{Float64}

我尝试使用[conf_intervals...]来展开conf_intervals,但向量没有改变。

非常感谢


1
在Julia中,沿列切片比沿行切片更有效率。如果可以的话,应该组织数据以便可以执行a[:, i]而不是a[i, :] - DNF
谢谢!我忘记了。 - Luca Monno
2个回答

11
你可以使用理解:
mat2x10 = [tup[k] for k in 1:2, tup in conf_intervals]
mat10x2 = [tup[k] for tup in conf_intervals, k in 1:2]

或者你可以重新解释相同的记忆。这种方式更加脆弱 - 它不适用于所有元组向量,例如Any[(i, i^2/2) for i in 1:10]。但对于Vector{Tuple{Float64, Float64}}
if VERSION >= v"1.6"
    reinterpret(reshape, Float64, conf_intervals)
else
    reshape(reinterpret(Float64, conf_intervals), 2, :)
end
mat2x10 == ans  # true

编辑:在 Julia 1.9+ 版本中,您还可以使用 stack(conf_intervals)。就像理解 mat2x10 一样,这会创建一个新的数组。

9
你需要使用 collect 将元组转换为向量,然后你就可以将它们组合起来:
julia> hcat(collect.(conf_intervals)...)
2×10 Matrix{Float64}:
 -1.59757  -2.10057  -1.4437   -1.32868  -1.10686  -1.41256  -1.5696   -1.67288  -1.51947  -1.72257
  1.24604   1.61692   1.77684   1.3599    1.90853   1.30831   1.10667   1.58356   1.56811   1.70685

如果你需要转置结果,就在命令的末尾添加一个撇号 '

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接