Numpy - 如何在不使用 python 循环的情况下转换此数组?

Numpy - How can I transform this array without using python loops?

我的输入是 y_true 标签的列表,其中位置 i 的元素包含 0..len(classes) 范围内的值,并描述了 class 该元素的内容的数据集确实是。 i 的范围从 0len(data)。示例如下:

# 5 elements in data, 3 classes, all of which had representation in the data:
y_true = [0,2,1,0,1]

我希望我的输出是 len(classes)len(data) 列表列表,其中内部列表 i 将在 [ 的位置有一个 1 =38=][i],和 0 在其他 len(classes)-1 个槽中,示例:

#same configuration as the previous example
y_true = [0,2,1,0,1]  
result = [[1,0,0],[0,0,2],[0,1,0],[1,0,0],[0,1,0]]

这是我初始化的方式 result:

result = np.zeros((len(y_true), max(y_true)+1))

但是我无法在这个问题上取得任何进一步的进展。我尝试使用 add.at(result, y_true, 1) 并将 y_true 的形状翻转过来,但都没有产生我想要的结果。哪些功能可以实现我在这里尝试做的事情?

编辑:为了更清楚地说明我想要实现的目标,我使用了 for 循环:

result = np.zeros((len(y_true), max(y_true)+1))
for x in range(4):
  result[x][y_true[x]] = 1

您可以使用花哨的索引:

result = np.zeros((len(y_true), max(y_true)+1), dtype=int)
result[np.arange(len(y_true)), y_true] = 1

输出:

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

备选

一个有趣的替代方法可能是使用 pandas.get_dummies:

import pandas as pd
result = pd.get_dummies(y_true).to_numpy()

输出:

array([[1, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [1, 0, 0],
       [0, 1, 0]], dtype=uint8)