朱莉娅,如何将二维数组合并到三维数组中?

3

我有一个3D数组,想复制底部的“slice”,即所有列和dim3的最后一行,并将其粘贴到原始3D数组的底部。由于某种原因,Julia将我的“slice”视为2D数组而不是3D数组,因此不允许连接。我尝试了几个方法,但都没有成功。谢谢。以下是MWE。

如果我从这里开始:

3×2×2 Array{Int64,3}:
[:, :, 1] =
 1  4
 2  5
 3  6

[:, :, 2] =
 1  4
 2  5
 3  6

我希望最终得到这样的结果:

3×2×2 Array{Int64,3}:
[:, :, 1] =
 1  4
 2  5
 3  6
 3  6
[:, :, 2] =
 1  4
 2  5
 3  6
 3  6

a, b = [1;2;3], [4;5;6]
c = hcat(a,b)
d = cat(c,c,dims=3)
size(d)
e = d[3,:,:]
f = hcat(d,3)
ERROR: DimensionMismatch("mismatch in dimension 1 (expected 3 got 1)")


2个回答

4

这是做法:

julia> mat = reshape(repeat(1:6, 2), 3, 2, 2)
3×2×2 Array{Int64,3}:
[:, :, 1] =
 1  4
 2  5
 3  6

[:, :, 2] =
 1  4
 2  5
 3  6

julia> [mat; mat[3:3, :, :]]
4×2×2 Array{Int64,3}:
[:, :, 1] =
 1  4
 2  5
 3  6
 3  6

[:, :, 2] =
 1  4
 2  5
 3  6
 3  6

注意,使用3会减少一维,但使用3:3会保留它。

另一方面,如果您有一个二维数组,并希望在前面添加一个尺寸为1的维度,则可以执行以下操作:

julia> mat2 = mat[3, :, :]
2×2 Array{Int64,2}:
 3  3
 6  6

julia> reshape(mat2, 1, size(mat2)...)
1×2×2 Array{Int64,3}:
[:, :, 1] =
 3  6

[:, :, 2] =
 3  6

然后你可以将这样的矩阵与其他3D矩阵连接起来。


哇,这太简单了。非常感谢。 - Jim Maas

1

对Bogumil Kaminski的好解决方案进行补充的一个小注释:

cat(mat, mat[3:3,:,:]; dims=1)  # concatenates as: [mat; mat[3:3, :, :]]

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