Как сравнить 3 numy массива поэлементно и получить результаты в виде массива с максимальными значениями? - PullRequest
2 голосов
/ 08 марта 2019

Числовые массивы содержат вероятности предсказания, которые выглядят так:

predict_prob1 =([[0.95602106, 0.04397894],
                 [0.93332366, 0.06667634],
                 [0.97311459, 0.02688541],
                 [0.97323962, 0.02676038]])

predict_prob2 =([[0.70425144, 0.29574856],
                 [0.69751251, 0.30248749],
                 [0.7072872 , 0.2927128 ],
                 [0.68683139, 0.31316861]])

predict_prob3 =([[0.56551921, 0.43448079],
                 [0.93321106, 0.06678894],
                 [0.92345399, 0.07654601],
                 [0.88396842, 0.11603158]])

Я хочу сравнить эти три элемента numpy.ndarray и выяснить, какой массив имеет максимальную вероятность в результате. Три из массивов имеют одинаковую длину. Я пытался реализовать что-то вроде этого, что не правильно.

for i in range(len(predict_prob1)):
    if(predict_prob1[i] > predict_prob2[i])
        c = predict_prob1[i]
    else
        c = predict_prob2[i]
    if(c > predict_prob3[i])
        result = c
    else
        result = array[i]

Пожалуйста, помогите !!

Ответы [ 4 ]

3 голосов
/ 08 марта 2019

Вы можете сделать с np.maximum.reduce:

np.maximum.reduce([A, B, C])

, где A, B, C равны numpy.ndarray

Для вашего примера это приводит:

[[0.95602106 0.43448079]
 [0.93332366 0.30248749]
 [0.97311459 0.2927128 ]
 [0.97323962 0.31316861]]
2 голосов
/ 08 марта 2019

Для меня не совсем понятно, о чем вы спрашиваете - Если желаемый результат - массив 4x2, который индексирует, какой из трех массивов имеет максимальное значение в позиции i,j, тогда вы хотите используйте np.argmax

>>> import numpy as np
>>> predict_prob1 =([[0.95602106, 0.04397894],
    [0.93332366, 0.06667634],
    [0.97311459, 0.02688541],
    [0.97323962, 0.02676038]])
>>> predict_prob2 =([[0.70425144, 0.29574856],
    [0.69751251, 0.30248749],
    [0.7072872 , 0.2927128 ],
    [0.68683139, 0.31316861]])
>>> predict_prob3 =([[0.56551921, 0.43448079],
    [0.93321106, 0.06678894],
    [0.92345399, 0.07654601],
    [0.88396842, 0.11603158]])
>>> np.argmax((predict_prob1,predict_prob2,predict_prob3), 0)
array([[0, 2],
       [0, 1],
       [0, 1],
       [0, 1]])
>>>

Добавление

Прочитав комментарий ОП , я добавляю следующее к своему ответу

>>> names = np.array(['predict_prob%d'%(i+1) for i in range(3)])
>>> names[np.argmax((predict_prob1,predict_prob2,predict_prob3),0)]
array([['predict_prob1', 'predict_prob3'],
       ['predict_prob1', 'predict_prob2'],
       ['predict_prob1', 'predict_prob2'],
       ['predict_prob1', 'predict_prob2']], dtype='<U13')
>>> 
1 голос
/ 08 марта 2019

Предполагая, что для каждой строки требуется индекс массива с наибольшей вероятностью для класса 0:

which = 0

np.stack([predict_prob1, predict_prob2, predict_prob3], axis=2)[:, which, :].argmax(axis=1)

Выход:

array([0, 0, 0, 0])

Для 1 класса:

array([2, 1, 1, 1])
0 голосов
/ 08 марта 2019

Вы можете использовать тот факт, что операнды> и <дают булеву маску для ваших массивов. </p>

import numpy as np

predict_prob1 =np.array([[0.95602106, 0.04397894],
   [0.93332366, 0.06667634],
   [0.97311459, 0.02688541],
   [0.97323962, 0.02676038]])

predict_prob2 =np.array([[0.70425144, 0.29574856],
   [0.69751251, 0.30248749],
   [0.7072872 , 0.2927128 ],
   [0.68683139, 0.31316861]])

predict_prob3 =np.array([[0.56551921, 0.43448079],
   [0.93321106, 0.06678894],
   [0.92345399, 0.07654601],
   [0.88396842, 0.11603158]])

predict_prob = (predict_prob1>predict_prob2)*predict_prob1 + (predict_prob1<predict_prob2)*predict_prob2
predict_prob = (predict_prob>predict_prob3)*predict_prob + (predict_prob<predict_prob3)*predict_prob3

print(predict_prob)

Результат:

[[0.95602106 0.43448079]
 [0.93332366 0.30248749]
 [0.97311459 0.2927128 ]
 [0.97323962 0.31316861]]
...