Python: добавить индексное значение индекса к каждому элементу массива - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь измерить точность и вызвать алгоритм knn для набора данных Iris без использования sklearn или чего-то подобного. Моя идея состоит в том, чтобы добавить как прогнозируемые, так и истинные значения с помощью индекса, например:

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

, затем удалить все не нули или не те ... и сопоставить индексы, чтобы получить сумму TP. К сожалению, код, который я придумал, только добавляет массив в длину, есть у кого-нибудь идея о том, как сделать так, чтобы идентификатор оставался таким, чтобы у нас было измерение (n, 2)? РЕДАКТИРОВАТЬ: Было бы здорово, если бы можно было сделать это без использования Pandas df. ​​

Заранее спасибо,

Николас

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Если я правильно понял, вы хотите матрицу размера n x 2 после вставки id в y_pred. Если это так, вы можете сделать это следующими способами:

Вариант-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]])
1 голос
/ 04 мая 2020

Вы также можете сразу создать матрицу путаницы вместо добавления индексов. Например:

>>> 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
...