NumPy - 从 2D numpy 数组创建 1-hot 张量

NumPy - creating 1-hot tensor from a 2D numpy array

我有一个数值范围为 0 到 59 的 numpy 二维数组。

对于那些熟悉 DL,特别是图像分割的人 - 我从 .png 图像创建数组(称之为 L),每个像素 L[x,y] 的值表示 class这个像素属于(60 classes)。

我想创建一个 1-hot 张量 - Lhot,其中 (Lhot[x,y,z] == 1) 仅当 (L[x,y] == z) 时,否则为 0。

我想用某种 broadcasting/indexing(1,2 行)创建它 - 没有循环。

在功能上应该等同于这段代码(Dtype对应L):

Lhot = np.zeros((L.shape[0], L.shape[1], 60), dtype=Dtype)
for i in range(L.shape[0]):
    for j in range(L.shape[1]):
        Lhot[i,j,L[i,j]] = 1

有人有想法吗? 谢谢!

由于典型的单热编码是为一维向量定义的,您所要做的就是展平矩阵,使用来自 scikit-learn 的热编码器(或任何其他具有单热编码的库)并重新整形。

from sklearn.preprocessing import OneHotEncoder
n, m = L.shape
k = 60
Lhot = np.array(OneHotEncoder(n_values=k).fit_transform(L.reshape(-1,1)).todense()).reshape(n, m, k)

当然你也可以手工完成

n, m = L.shape
k = 60
Lhot = np.zeros((n*m, k)) # empty, flat array
Lhot[np.arange(n*m), L.flatten()] = 1 # one-hot encoding for 1D
Lhot = Lhot.reshape(n, m, k) # reshaping back to 3D tensor

使用纯 numpy

的方式更快更简洁
Lhot = np.transpose(np.eye(60)[L], (1,2,0))

您将 运行 遇到的多维单热点问题是它们变得 真的 大而 真的 稀疏并且有在 numpy/scipy(或 sklearn 或我认为的许多其他 ML 包)中没有处理超过 2D 的稀疏数组的好方法。你真的需要一个 n-d one-hot 吗?