One-hot将一列整数编码为NumPy矩阵,包括缺失的索引



从以下NumPy数组中:

[5, 2, 4, 6, 3]

我想得到下面的矩阵:

[
[0, 0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0, 0]
]

使用Pandasget_dummies看起来非常简单:

pd.get_dummies(original_array).values

但是它有一个缺点,在最后的矩阵中,缺失的索引没有被表示为列(例如,在这个例子中是0,1)。

如果我们假设所需的"列"的确切名称/索引为:提前知道(这里包括从0到6的所有整数),从初始数组开始得到上面显示的矩阵的最有效方法是什么?

您可以创建一个矩阵,然后使用高级索引为正确的列分配一个:

a = [5, 2, 4, 6, 3]
ohe = np.zeros((len(a), max(a) + 1), dtype=int)
ohe[np.arange(len(a)), a] = 1
ohe
array([[0, 0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0, 0]])

高级索引是您的答案!假设您知道想要的最终形状(这里是(5, 7)):

In [5]: desired_shape = (5, 7)
In [6]: z = np.zeros(desired_shape, dtype="uint8")
In [5]: z
Out[5]:
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
In [6]: idxs = [5, 2, 4, 6, 3]
In [7]: z[range(len(z)), idxs] = 1
In [8]: z
Out[8]:
array([[0, 0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 1, 0, 0, 0]], dtype=uint8)

相关内容

  • 没有找到相关文章