从以下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)