将2D矩阵的1s广播到1-hot 3D矩阵中

问题描述 投票:1回答:1

给出2D矩阵A,如何广播以创建3D矩阵B

A = [[1 1 1 1 0];[0 0 0 0 1]]
B = cat([[1 0 0 0 0];[0 0 0 0 0]],
        [[0 1 0 0 0];[0 0 0 0 0]], 
        [[0 0 1 0 0];[0 0 0 0 0]], 
        [[0 0 0 1 0];[0 0 0 0 0]], 
        [[0 0 0 0 0];[0 0 0 0 1]], dims=3)

我为这个问题标记了numpy-broadcasting,因为当我使用Julia 1.2.0时,Julia广播是基于NumPy广播建模的,因此可能会有类似的共享解决方案。

matrix julia numpy-broadcasting
1个回答
0
投票

我不确定这是否符合您对“广播”的定义,但是一种自然的方式来获得您想要的是:

julia> cat(diagm.(getindex.(Ref(A), 1:2, :))..., dims=3)
5×5×2 Array{Int64,3}:
[:, :, 1] =
 1  0  0  0  0
 0  1  0  0  0
 0  0  1  0  0
 0  0  0  1  0
 0  0  0  0  0

[:, :, 2] =
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  1

或者如果您实际上更希望避免广播(在这种情况下,这似乎更简单):

julia> cat((diagm(A[i, :]) for i in 1:2)..., dims=3)
5×5×2 Array{Int64,3}:
[:, :, 1] =
 1  0  0  0  0
 0  1  0  0  0
 0  0  1  0  0
 0  0  0  1  0
 0  0  0  0  0

[:, :, 2] =
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  0
 0  0  0  0  1
© www.soinside.com 2019 - 2024. All rights reserved.