Python:给每个数组元素添加索引一个索引值

Python: Add index an index value to each array element

我正在尝试在不使用 sklearn 或类似工具的情况下测量 Iris 数据集上 knn 算法的精度和召回率。我的想法是用索引附加预测值和真实值,如下所示:

id = [i for i in range(1,len(np.asarray(y_pred))+1)]
y_pred_id = np.insert(y_pred, 0, id)

然后删除所有不是零的,或者不是一个...并匹配索引以获得TP的数量。可悲的是,我想出的代码只附加了数组的长度,有没有人知道如何让 id 保持我们有 (n,2) 的维度? 编辑:如果不使用 Pandas df.

就可以做到这一点,那就太好了

提前致谢,

尼古拉斯

如果我没理解错的话,在将 id 插入 y_pred 之后,您需要一个 n x 2 大小的矩阵。如果是这样,您可以通过以下方式进行:

选项-1: 使用 np.reshape

...
y_pred_id = np.insert(y_pred, 0, id)
y_pred_id.reshape(2, n)  # you should define 'n' somewhere, maybe use len(id)!

Output:
array([[1, 2, 3, 4, 5, 6, 7, 8],
       [1, 1, 2, 0, 0, 1, 1, 2]])

选项-2: 使用 np.vstack

...
y_pred_id = np.vstack([y_pred, id])

Output:
array([[1, 1, 2, 0, 0, 1, 1, 2],
       [1, 2, 3, 4, 5, 6, 7, 8]])

您也可以立即构造一个混淆矩阵,而不是添加索引。例如:

>>> preds = np.random.randint(0,3,size=(10,))
>>> truth = np.random.randint(0,3,size=(10,))
>>> preds
array([0, 2, 2, 2, 2, 1, 1, 0, 0, 0])
>>> truth
array([0, 0, 1, 0, 2, 2, 0, 2, 0, 2])
>>> n =len( np.unique(truth))
>>> c_m = np.zeros((n,n))
>>> for i in range(len(truth_arr)):
...     c_m[truth[i],preds[i]] += 1
... 
>>> c_m = c_m.T
>>> c_m
array([[2., 0., 2.],
       [1., 0., 1.],
       [2., 1., 1.]])
# At this point you can calculate your metrics
>>> recall_0_class = c_m[0,0]/c_m[:,0].sum()
>>> recall_0_class
0.4