在Julia 1.0.5环境下,现有N个一维数组,如:
[0,1,2,3]
[0,1,2,3]
[0,1,2,3]
目标是合为一个二维数组:
0 1 2 3
0 1 2 3
0 1 2 3
之前使用了hcat,但是按列顺序排布的,即:
0 0 0
1 1 1
2 2 2
3 3 3
不是我们想看到的结果
请问各位达人,如何做才能按行顺序将N个一维转化为二维呢?
衷心感谢
vcat
https://docs.juliacn.com/latest/manual/arrays/#man-array-concatenation-1
hcat → horizontal cat
vcat → vertical cat
你这里加个转置hcat(Xs...)'
就可以了。
BUT 用cat
很容易踩的一个性能坑是内存分配,一般来说都会用 reduce(cat, Xs)
来做:
julia> using BenchmarkTools
julia> hcat_naive(Xs) = hcat(Xs...)'
hcat_naive (generic function with 1 method)
julia> hcat_reduce(Xs) = reduce(hcat, Xs)'
hcat_reduce (generic function with 1 method)
julia> vcat_reduce(Xs) = mapreduce(x->x', vcat, Xs)
vcat_reduce (generic function with 1 method)
julia> Xs = [collect(1:1000) for _ in 1:100];
julia> hcat_naive(Xs) == hcat_reduce(Xs) == vcat_reduce(Xs)
true
julia> @btime hcat_naive($Xs);
117.543 μs (6 allocations: 782.23 KiB)
julia> @btime hcat_reduce($Xs);
31.869 μs (3 allocations: 781.34 KiB)
julia> @btime vcat_reduce($Xs);
4.469 ms (397 allocations: 38.53 MiB)
hcat_naive
之所以慢是因为Xs...
展开有很大开销vcat_reduce
之所以慢是因为每次reduce的时候都会做一次类似于collect(x')
的操作
1 个赞