我有一个巨大的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]]
最有效的方法是什么?谢谢!
答案 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)