2017-02-22 9 views
2

У меня есть 2D Numpy массив как это,NumPy: Найти максимальное значение из каждой строки значение 1 и остальные как 0

array([[ 0.49596769, 1.15846407, -1.38944733], 
     [-0.47042814, -0.07512128 , 1.90417981]], dtype=float32) 

Я хочу, чтобы найти максимальное значение для каждой строки и изменить его на 1 и остальное как 0. Как это.

array([[ 0., 1., 0.], 
     [ 0., 0., 1.]], dtype=float32) 

Каков наиболее эффективный способ сделать это с помощью numpy?

ответ

6

Один из подходов -

(a == a.max(axis=1, keepdims=1)).astype(float) 

Пример запуска -

In [43]: a 
Out[43]: 
array([[ 0.49596769, 1.15846407, -1.38944733], 
     [-0.47042814, -0.07512128, 1.90417981]]) 

In [44]: (a == a.max(axis=1, keepdims=1)).astype(float) 
Out[44]: 
array([[ 0., 1., 0.], 
     [ 0., 0., 1.]]) 

Если есть несколько из них подряд с одинаковым максимальным значением, и вы хотели бы установить только первый в качестве 1 -

idx = a.argmax(axis=1) 
out = (idx[:,None] == np.arange(a.shape[1])).astype(float) 

Пример запуска -

In [49]: a 
Out[49]: 
array([[2, 4, 4], 
     [3, 4, 5]]) 

In [50]: (a == a.max(axis=1, keepdims=1)).astype(float) 
Out[50]: 
array([[ 0., 1., 1.], 
     [ 0., 0., 1.]]) 

In [51]: idx = a.argmax(axis=1) 

In [52]: (idx[:,None] == np.arange(a.shape[1])).astype(float) 
Out[52]: 
array([[ 0., 1., 0.], 
     [ 0., 0., 1.]]) 

Для выполнения, мы можем иметь подход, основанный на инициализации -

def initialization_based(a): 
    idx = a.argmax(axis=1) 
    out = np.zeros_like(a,dtype=float) 
    out[np.arange(a.shape[0]), idx] = 1 
    return out 
0

или с argsort:

(a.argsort()==a.shape[1]-1).astype(int) 

будет управлять несколькими MAXS.

+0

Думаю, вам нужен еще один «argsort» там: '(a.argsort (1) .argsort (1) == a.shape [1] -1) .astype (int)'. – Divakar