Julia:一种从数组数组中获取矩阵的快速而优雅的方法

Ant*_*rev 4 arrays reshape julia arrayofarrays

有一个包含超过 10,000 对 Float64 值的数组。像这样的东西:

v = [[rand(),rand()], ..., [rand(),rand()]]
Run Code Online (Sandbox Code Playgroud)

我想从中得到一个包含两列的矩阵。可以用一个循环绕过所有对,它看起来很麻烦,但在几分之一秒内给出结果:

x = Vector{Float64}()
y = Vector{Float64}()
for i = 1:length(v)
    push!(x, v[i][1])
    push!(y, v[i][2])
end
w = hcat(x,y)
Run Code Online (Sandbox Code Playgroud)

permutedims(reshape(hcat(v...), (length(v[1]), length(v))))我在此任务中找到的解决方案看起来更优雅但完全挂起 Julia,需要重新启动会话。也许六年前它是最佳的,但现在它不适用于大型阵列。有没有既紧凑又快速的解决方案?

Bog*_*ski 9

我希望这对您来说足够简短和有效:

 getindex.(v, [1 2])
Run Code Online (Sandbox Code Playgroud)

如果你想要更简单的东西来消化:

[v[i][j] for i in 1:length(v), j in 1:2]
Run Code Online (Sandbox Code Playgroud)

另外,hcat解决方案可以写成:

permutedims(reshape(reduce(hcat, v), (length(v[1]), length(v))));
Run Code Online (Sandbox Code Playgroud)

它不应该挂你的朱莉娅(请确认 - 它对我有用)。

@Antonello:要了解为什么会这样,请考虑一个更简单的示例:

julia> string.(["a", "b", "c"], [1 2])
3×2 Matrix{String}:
 "a1"  "a2"
 "b1"  "b2"
 "c1"  "c2"
Run Code Online (Sandbox Code Playgroud)

我正在广播一列Vector ["a", "b", "c"]和一个 1-row Matrix [1 2]。关键是这[1 2]是一个Matrix. 因此,它使广播同时扩展行(由向量强制)和列(由 a 强制Matrix)。为了发生这种扩展,[1 2]矩阵只有一行是至关重要的。现在更清楚了吗?