如何在Julia中交错数组

8

在Julia中是否可以交错两个数组?

例如,如果a=[1:10]b=[11:20],我希望能够返回以下结果:

20-element Array{Int64,1}:
  1
  11
  2
  12
  3
  13
  4
  14
  .
  .
  .

与Ruby类似的是,可以将两个数组合并并交替排列。 在Ruby中合并和交错两个数组

5个回答

9

有一种简单的方法可以做到这一点,而不需要使用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使用列主序

对于元组数组,这种方法会失败,但是您可以使用permutedims(tuples_2D)[:]代替tuples_2D'[:] - dnv

5
< p >弄明白了!< /p >
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}对象。 - DSM
啊,是的,谢谢你指出来。我使用了这里指定的hack编辑了答案:http://stackoverflow.com/questions/23957734/getting-1d-subsets-of-multi-dimensional-arrays-in-julia - bdeonovic

4
您可以直接使用。

reshape([a b].', length(a)+length(b))

获取向量。

谢谢,已经注意到了。我想当你没有明确使用reshape时,这种hack更有用。 - bdeonovic

2
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 (minmax):  190.895 ns …   1.548 μs  ┊ GC (minmax): 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)))

比较快速

1

为了完整性,将 @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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接