在Julia中连接数组

48
如果两个Int数组是a = [1;2;3]b = [4;5;6],我们如何在两个维度上连接这两个数组?期望输出为:
julia> out1
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

julia> out2
3x2 Array{Int64,2}:
 1  4
 2  5
 3  6

2
可能是Concatenate 2 Julia Arrays without modifying them的重复问题。 - niczky12
5个回答

46

使用 vcathcat 函数:

julia> a, b = [1;2;3], [4;5;6]
([1,2,3],[4,5,6])

help?> vcat
Base.vcat(A...)

   Concatenate along dimension 1

julia> vcat(a, b)
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

help?> hcat
Base.hcat(A...)

   Concatenate along dimension 2

julia> hcat(a, b)
3x2 Array{Int64,2}:
 1  4
 2  5
 3  6

34

方括号可用于连接字符串:

julia> a, b = [1;2;3], [4;5;6]
([1,2,3],[4,5,6])

julia> [a; b]
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

julia> [a b]
3×2 Array{Int64,2}:
 1  4
 2  5
 3  6

3
这是vcathcat的语法糖,分别表示为[e.head for e in [:([a; b]), :([a b])]] # Symbol[:vcat,:hcat] - HarmonicaMuse
12
通常我认为应该优先使用 vcathcat,因为这种解决方案对空白字符敏感。例如:[a - b] 将使用 vcat,而 [a -b] 将使用 hcat。这可能是一个难以找到的恶性 bug。 - Chris Rackauckas
7
看起来不喜欢语法糖版本有点过时了。毕竟,这个糖是用来干什么的?你是在说这种语法可能会被移除吗? - DNF

17

你可以使用cat函数沿着任意维度拼接任意数量的数组。第一个输入是要执行拼接操作的维度;其余的输入都是你希望拼接在一起的所有数组。

a = [1;2;3]
b = [4;5;6]

## Concatenate 2 arrays along the first dimension
cat(1,a,b)
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

## Concatenate 2 arrays along the second dimension
cat(2,a,b)
3x2 Array{Int64,2}:
 1  4
 2  5
 3  6

## Concatenate 2 arrays along the third dimension
cat(3,a,b)
3x1x2 Array{Int64,3}:
[:, :, 1] =
 1
 2
 3

[:, :, 2] =
 4
 5
 6

5
更新版本需要使用dims关键字,例如cat(a,b,dims=3) - dividebyzero

2

使用reduce函数将两个数组连接起来是一种函数式的方法。

a = rand(10, 1)
b = rand(10, 1)
c = reduce(hcat, [ a, b])

1
对于两个数组来说,这种方法并不是很重要,但是当你想要连接多个数组时,这种方法比hcat(arrays...)具有巨大的性能优势。 - KeithWM

2

当遇到Array{Array,1}时,语法会有些不同,像这样:

最初的回答:

julia> a=[[1,2],[3,4]]
2-element Array{Array{Int64,1},1}:
 [1, 2]
 [3, 4]

julia> vcat(a)
2-element Array{Array{Int64,1},1}:
 [1, 2]
 [3, 4]

julia> hcat(a)
2×1 Array{Array{Int64,1},2}:
 [1, 2]
 [3, 4]

julia> vcat(a...)
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> hcat(a...)
2×2 Array{Int64,2}:
 1  3
 2  4

参考:

......在函数定义中将许多参数合并为一个参数 在函数定义的上下文中,运算符...用于将许多不同的参数组合成一个单一的参数。将许多不同的参数组合成一个单一的参数的这种使用...操作符的方法称为 slurping。

注解:slurping是一种将多个参数打包成列表的技术,常用于Perl语言中。


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