一次性将一列整数编码为 NumPy 矩阵,包括缺失的索引

One-hot encode a column of integers into a NumPy matrix, including missing indices

来自以下 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]
]

使用Pandas get_dummies 看起来很简单:

pd.get_dummies(original_array).values

但它有一个缺点,即缺少的索引在最终矩阵中未表示为列(例如本例中的 0、1)。

如果我们假设预先知道所需“列”的确切 names/indices(此处包括从 0 到 6 的所有整数),那么获取矩阵的最有效方法是什么如上所示,从初始数组开始?

您可以创建一个 zeros 矩阵,然后使用高级索引分配一个来更正列:

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)