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 吗?
我有一个数值范围为 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 吗?