繁体   English   中英

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

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

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

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

我想创建一个1热的张量 - 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

有人有想法吗? 谢谢!

使用纯粹的numpy更快更清洁的方式

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

你会遇到多维一热的问题是它们变得非常庞大且非常稀疏,并且没有好办法处理numpy / scipy (或者我认为是sklearn或许多其他ML包)中的2D以上的稀疏数组。 你真的需要一个热门吗?

由于为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM