在 Julia 中连接数组
Posted
技术标签:
【中文标题】在 Julia 中连接数组【英文标题】:Concatenating arrays in Julia 【发布时间】:2017-01-27 22:47:21 【问题描述】:如果Int
这两个数组分别是a = [1;2;3]
和b = [4;5;6]
,我们如何在两个维度上连接这两个数组?预期的输出是,
julia> out1
6-element ArrayInt64,1:
1
2
3
4
5
6
julia> out2
3x2 ArrayInt64,2:
1 4
2 5
3 6
【问题讨论】:
Concatenate 2 Julia Arrays without modifying them的可能重复 【参考方案1】:使用vcat
和hcat
函数:
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 ArrayInt64,1:
1
2
3
4
5
6
help?> hcat
Base.hcat(A...)
Concatenate along dimension 2
julia> hcat(a, b)
3x2 ArrayInt64,2:
1 4
2 5
3 6
【讨论】:
【参考方案2】:方括号可用于连接:
julia> a, b = [1;2;3], [4;5;6]
([1,2,3],[4,5,6])
julia> [a; b]
6-element ArrayInt64,1:
1
2
3
4
5
6
julia> [a b]
3×2 ArrayInt64,2:
1 4
2 5
3 6
【讨论】:
这是vcat
和hcat
的语法糖:[e.head for e in [:([a; b]), :([a b])]] # Symbol[:vcat,:hcat]
一般我认为vcat
和hcat
应该是首选,因为这个解决方案是空白敏感的。例如:[a - b]
将 vcat
而[a -b]
将 hcat
。这可能是一个令人讨厌的错误。
似乎有点落后于不更喜欢语法糖版本。毕竟,for 的糖是什么?你是说这个语法可能会被删除?【参考方案3】:
您可以使用cat
函数沿任意维度连接任意数量的数组。第一个输入是执行连接的维度;其余的输入是您希望连接在一起的所有数组
a = [1;2;3]
b = [4;5;6]
## Concatenate 2 arrays along the first dimension
cat(1,a,b)
6-element ArrayInt64,1:
1
2
3
4
5
6
## Concatenate 2 arrays along the second dimension
cat(2,a,b)
3x2 ArrayInt64,2:
1 4
2 5
3 6
## Concatenate 2 arrays along the third dimension
cat(3,a,b)
3x1x2 ArrayInt64,3:
[:, :, 1] =
1
2
3
[:, :, 2] =
4
5
6
【讨论】:
更新的版本需要dims
关键字,例如cat(a,b,dims=3)
【参考方案4】:
遇到ArrayArray,1时,语法有点不同,像这样:
julia> a=[[1,2],[3,4]]
2-element ArrayArrayInt64,1,1:
[1, 2]
[3, 4]
julia> vcat(a)
2-element ArrayArrayInt64,1,1:
[1, 2]
[3, 4]
julia> hcat(a)
2×1 ArrayArrayInt64,1,2:
[1, 2]
[3, 4]
julia> vcat(a...)
4-element ArrayInt64,1:
1
2
3
4
julia> hcat(a...)
2×2 ArrayInt64,2:
1 3
2 4
参考:
... 在函数定义中将许多参数组合成一个参数 在函数定义的上下文中, ... 运算符用于将许多不同的参数组合成一个参数。使用 ... 将许多不同的参数组合成一个参数称为 slurping
【讨论】:
以上是关于在 Julia 中连接数组的主要内容,如果未能解决你的问题,请参考以下文章