Numpy 2d массив со значениями с плавающей точкой находит максимальное значение в одной строке и сохраняет в другом массиве - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть программа, которая создала массив Numpy, и этот массив имеет массив

([[0.0543275, 0.51249827, 0.43317423], [0.07144389, 0.51152126, 0.41703486], [0.0776112, 0.48593384, 0.43645496, 0.43645496]])

Я использовал следующий код для поиска максимума в строке, но он не работает для значений с плавающей запятой

for row in a:
maxi = np.argmax(np.max(row, axis=0))
float(maxi)
print(maxi)

Я хочу что-то вроде этого

массив ([[0, 1, 0], [0, 1, 0], [0, 1, 0]])

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019
In [41]: arr = np.array([[0.0543275 , 0.51249827, 0.43317423], [0.07144389, 0.51
    ...: 152126, 0.41703486], [0.0776112 , 0.48593384, 0.43645496]])            
In [42]: arr                                                                    
Out[42]: 
array([[0.0543275 , 0.51249827, 0.43317423],
       [0.07144389, 0.51152126, 0.41703486],
       [0.0776112 , 0.48593384, 0.43645496]])

Максимум в каждой строке:

In [47]: np.max(arr, axis=1)                                                    
Out[47]: array([0.51249827, 0.51152126, 0.48593384])

Его индекс строки:

In [48]: np.argmax(arr, axis=1)                                                 
Out[48]: array([1, 1, 1])

Мы можем отобразить этот массив argmax на массив с таким жеформа с:

In [52]: x = np.zeros(arr.shape, int)                                           
In [53]: x[np.arange(3),_48] = 1                                                
In [54]: x                                                                      
Out[54]: 
array([[0, 1, 0],
       [0, 1, 0],
       [0, 1, 0]])
0 голосов
/ 23 февраля 2019

Upd: изначально это было неправильно, теперь это просто суть предыдущего правильного ответа:

a = np.array([[0.0543275 , 0.51249827, 0.43317423],
              [0.07144389, 0.51152126, 0.41703486], 
              [0.0776112 , 0.48593384, 0.43645496]])

b = np.zeros_like(a)

b[np.arange(a.shape[0]), np.argmax(a, axis=1)] = 1

Поскольку np.argmax () дает нам индексы элементов max, мы просто используем ихдля индексации напрямую.Теперь b содержит желаемый результат:

array([[0., 1., 0.],
       [0., 1., 0.],
       [0., 1., 0.]])

, вы также можете сделать: b.astype(int), чтобы обратиться к целым числам.

0 голосов
/ 23 февраля 2019

Вот опция, которая работает

for e, i in enumerate(a):
    for f, j in enumerate(i):
        if j == max(i):
            a[e][f] = 1
        else:
            a[e][f] = 0

Это преобразует используемый вами массив в желаемую форму:

<class 'numpy.ndarray'>
[[0. 1. 0.]
 [0. 1. 0.]
 [0. 1. 0.]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...