#python #numpy
#питон #numpy #python
Вопрос:
TN=FN=FP=TP=0
for j in range(0,len(data)):
if((data['y'][j]==0) amp; (data['proba'][j]==0)):
TN =1
elif((data['y'][j]==0) amp; (data['proba'][j]==1)):
FN =1
elif((data['y'][j]==1) amp; (data['proba'][j]==0)):
FP =1
elif((data['y'][j]==1) amp; (data['proba'][j]==1)):
TP =1
когда я попытался использовать приведенный выше код с помощью numpy, упомянутого ниже, я получаю сообщение об ошибке,
может ли кто-нибудь подсказать, как использовать приведенный выше код с помощью numpy.
for j in range(0,len(data_auc.y_bar)):
np.where((data_auc['y'][j] == 0) amp; (data_auc['ypred'][j] == 0), TN =1,TN =0)
np.where((data_auc['y'][j] == 0) amp; (data_auc['ypred'][j] == 1), FN =1,FN =0)
np.where((data_auc['y'][j] == 1) amp; (data_auc['ypred'][j] == 0), FP =1,FP =0)
np.where((data_auc['y'][j] == 1) amp; (data_auc['ypred'][j] == 1), TP =1,TP =0)
File "<ipython-input-9-eec3f903a254>", line 14
np.where((data_auc['y'][j] == 0) amp; (data_auc['ypred'][j] == 0), TN =1:TN =0)
^
SyntaxError: invalid syntax
Комментарии:
1. (Повторно) прочитайте документацию для
np.where
. Это не простая замена if / else. Это функция , которая принимает 3 аргумента (массивы). Как и во всех функциях python, эти аргументы оцениваются перед передачей в функцию. Другими словами, это стандартный синтаксис python, а не что-то новое.2. Кроме того, похоже, что вы используете двоичное и (amp;) вместо логического (
and
),
Ответ №1:
Давайте начнем с самого начала и подумаем о том, что на самом деле делает этот код:
TN=FN=FP=TP=0
Итак, у нас есть четыре целых числа.
for j in range(0,len(data)):
Мы перебираем все строки. Обратите внимание, что все следующие части независимы и похожи, поэтому я собираюсь обсудить только одну из них.
if((data['y'][j]==0) amp; (data['proba'][j]==0)):
TN =1
Когда цикл будет завершен, TN будет количеством строк, где y
равно 0 и proba
равно 0. Поэтому мы можем исключить цикл следующим образом:
TN = ((data['y']==0) amp; (data['proba']==0)).sum()
Проделайте это еще три раза для трех других переменных, и вы получите код, который будет как минимум в 10 раз быстрее.