Как преобразовать условие if else в numpy в python

#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 раз быстрее.