如何在 numpy 中向量化一个热编码循环

How to vectorize one hot encoding loop in numpy

有没有办法向量化此代码中的循环?

def get_onehot(y):
    categories = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    arr = np.zeros((y.shape[0], len(categories)))
    for i in range(y.shape[0]):
        n = y[i]
        arr[i][n] = 1
    return arr

>>> get_onehot(np.array([0, 2, 5]))
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]])

例如,我认为这不是最有效的方法,我想知道是否有可用的代码改进。

如果你不想使用 scikit-learn,这里有一个 NumPy 的方法:

import numpy as np

def get_onehot(y, n=10):
    return np.eye(n)[y]

get_onehot(np.array([0, 2, 5]))

# array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
#        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]])

np.eye documentation