如何对二维矩阵进行一次热编码?

时间:2020-09-01 08:07:47

标签: python arrays numpy one-hot-encoding

我有一个巨大的numpy 2d数组,每个值都是0到3之间的一个类别。

[[3 1 0 ... 1]
...
 [2 0 1 ... 3]]

我想对其进行一次热编码(0为0 0 0 1,1为0 0 1 0,等等),因此以上内容将变为:

[[1 0 0 0 0 0 1 0 0 0 0 1 ... 0 0 1 0]
...
 [0 1 0 0 0 0 0 1 0 0 1 0 ... 1 0 0 0]]

最有效的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

假设您有一个(M, N)矩阵,并且最大值为P= 4):

M = 6
N = 5
P = 4
mat = np.random.randint(P, size=(M, N))

首先使用(M, N, P)作为最后一维的索引,将其编码为零和一的mat矩阵:

encoded = np.zeros((M, N, P), dtype=int)
encoded[(*np.ogrid[:M, :N], (P - 1) - mat)]

或者,使用np.put_along_axis

np.put_along_axis(encoded, (P - 1) - np.expand_dims(mat, -1), 1, axis=-1)

数据已在内存中具有相同的顺序,因为numpy默认使用C顺序。您可以reshape以获得最终结果:

encoded.reshape(M, N * P)