[英]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.