如何将N个一维数组按行顺序转化为一个二维数组?

在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
不是我们想看到的结果 :rofl:
请问各位达人,如何做才能按行顺序将N个一维转化为二维呢?
衷心感谢 :heartpulse:

vcat

https://docs.juliacn.com/latest/manual/arrays/#man-array-concatenation-1

hcat → horizontal cat
vcat → vertical cat

你这里加个转置hcat(Xs...)'就可以了。

BUTcat很容易踩的一个性能坑是内存分配,一般来说都会用 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 个赞