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

时间:2017-08-07 22:49:42

标签: python numpy deep-learning image-segmentation

我有一个numpy 2D数组,其值介于0到59之间。

对于那些熟悉DL并且特别是图像分割的人 - 我从.png图像创建数组(称之为L),每个像素的值L [x,y]表示该像素所属的类(在60个班级中。)

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

我想用某种广播/索引(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
谁有个主意呢? 谢谢!

2 个答案:

答案 0 :(得分:3)

由于为1D向量定义了典型的单热编码,所以您只需将矩阵展平,使用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

答案 1 :(得分:3)

使用纯numpy

更快更清洁
Lhot = np.transpose(np.eye(60)[L], (1,2,0))

你遇到多维一热的问题是他们真的大而真的稀疏而且没有好处理稀疏的方法我认为numpy / scipy(或sklearn或许多其他ML包中包含多于2D的数组)。你真的需要一个n-d一热吗?