在Julia中是否可以交错两个数组?
例如,如果a=[1:10]
和b=[11:20]
,我希望能够返回以下结果:
20-element Array{Int64,1}:
1
11
2
12
3
13
4
14
.
.
.
与Ruby类似的是,可以将两个数组合并并交替排列。 在Ruby中合并和交错两个数组
在Julia中是否可以交错两个数组?
例如,如果a=[1:10]
和b=[11:20]
,我希望能够返回以下结果:
20-element Array{Int64,1}:
1
11
2
12
3
13
4
14
.
.
.
与Ruby类似的是,可以将两个数组合并并交替排列。 在Ruby中合并和交错两个数组
有一种简单的方法可以做到这一点,而不需要使用reshape()
函数。特别地,我们可以将向量绑定到矩阵中,然后在该矩阵的转置上使用[:]
。例如:
julia> a = 1:10
julia> b = 11:20
julia> [a b]'[:]
20-element Array{Int64,1}:
1
11
2
12
3
13
.
.
.
20
[a b]
转置后得到一个2×10的矩阵,然后使用[:]
将其所有元素以向量形式返回。之所以[:]
对我们如此有用,是因为Julia使用列主序。reshape([a b]',20,1)
还有一些更为普遍的内容:
reshape([a b].',size(a,1)+size(b,1),1)
reshape([a b].',size(a,1)+size(b,1),1)[:]
20x1 Array{Int64,2}
对象,而不是10-element Array{Int64,1}
对象。 - DSMreshape([a b].', length(a)+length(b))
julia> @benchmark collect(Iterators.flatten(zip(a,b))) setup = begin a=rand(100); b=rand(100) end
BenchmarkTools.Trial: 10000 samples with 714 evaluations.
Range (min … max): 190.895 ns … 1.548 μs ┊ GC (min … max): 0.00% … 65.85%
Time (median): 238.843 ns ┊ GC (median): 0.00%
Time (mean ± σ): 265.428 ns ± 148.757 ns ┊ GC (mean ± σ): 8.40% ± 11.75%
▅▅██▅▃▂▂▁ ▁▁ ▂
██████████▇█▇▇▅▄▄▃▁▁▁▃▄█▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▃▁▁▁▁▃▃▁▁▁▁▁▃▁▃▄▆▇███ █
191 ns Histogram: log(frequency) by time 1.11 μs <
Memory estimate: 1.77 KiB, allocs estimate: 1.
看起来似乎
collect(Iterators.flatten(zip(a,b)))
为了完整性,将 @bdeonovic 的解决方案扩展到二维数组。
julia> a
2×2 Array{Int64,2}:
1 2
3 4
julia> b
2×2 Array{Int64,2}:
6 7
8 9
julia> reshape([a[:] b[:]]', 4, 2)
4×2 Array{Int64,2}:
1 2
6 7
3 4
8 9
julia> reshape( [a' b']', 2, 4 )
2×4 Array{Int64,2}:
1 6 2 7
3 8 4 9
交错数组(叠放/纵向连接):
julia> reshape([a' b']', 4, 2)
4×2 Array{Int64,2}:
1 2
3 4
6 7
8 9
permutedims(tuples_2D)[:]
代替tuples_2D'[:]
。 - dnv