繁体   English   中英

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

[英]Python: Add index an index value to each array element

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

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后,您需要一个nx 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM