作者:jiangping最棒_766 | 来源:互联网 | 2024-12-14 15:24
有一个包含超过 10,000 对 Float64 值的数组。像这样的东西:v = [[rand(),rand()], ..., [rand(),rand()]]我想从中得到一个包含两列的矩阵。可以用一
有一个包含超过 10,000 对 Float64 值的数组。像这样的东西:
v = [[rand(),rand()], ..., [rand(),rand()]]
我想从中得到一个包含两列的矩阵。可以用一个循环绕过所有对,它看起来很麻烦,但在几分之一秒内给出结果:
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)
permutedims(reshape(hcat(v...), (length(v[1]), length(v))))
我在此任务中找到的解决方案看起来更优雅但完全挂起 Julia,需要重新启动会话。也许六年前它是最佳的,但现在它不适用于大型阵列。有没有既紧凑又快速的解决方案?
回答
我希望这对您来说足够简短和有效:
getindex.(v, [1 2])
如果你想要更简单的东西来消化:
[v[i][j] for i in 1:length(v), j in 1:2]
另外,hcat
解决方案可以写成:
permutedims(reshape(reduce(hcat, v), (length(v[1]), length(v))));
它不应该挂你的朱莉娅(请确认 - 它对我有用)。
@Antonello:要了解为什么会这样,请考虑一个更简单的示例:
julia> string.(["a", "b", "c"], [1 2])
3×2 Matrix{String}:
"a1" "a2"
"b1" "b2"
"c1" "c2"
我正在广播一列Vector
["a", "b", "c"]
和一个 1-row Matrix
[1 2]
。关键是这[1 2]
是一个Matrix
. 因此,它使广播同时扩展行(由向量强制)和列(由 a 强制Matrix
)。为了发生这种扩展,[1 2]
矩阵只有一行是至关重要的。现在更清楚了吗?