Максимальное значение 3D-массива

Не поймите, почему люди делают это настолько сложным:

objs.sort(function(a, b){
  return a.last_nom > b.last_nom;
});

Для более строгих движков:

objs.sort(function(a, b){
  return a.last_nom == b.last_nom ? 0 : +(a.last_nom > b.last_nom) || -1;
});

Смените оператор, чтобы он отсортировался по обратному алфавитному порядку.

1
задан Surabhi Amit Chembra 13 July 2018 в 20:55
поделиться

3 ответа

Вы также можете использовать argmax с unravel_index:

def max_by_index(idx, arr):
    return (idx,) + np.unravel_index(np.argmax(arr[idx]), arr.shape[1:])

, например

import numpy as np
a = np.array([[[ 0.25,  0.10 ,  0.50 ,  0.15],
               [ 0.50,  0.60 ,  0.70 ,  0.30]],
              [[ 0.25,  0.50 ,  0.20 ,  0.70],
               [ 0.80,  0.10 ,  0.50 ,  0.15]]])

def max_by_index(idx, arr):
    return (idx,) + np.unravel_index(np.argmax(arr[idx]), arr.shape[1:])


print(max_by_index(0, a))

дает

(0, 1, 2)

3
ответ дан csunday95 17 August 2018 в 12:09
поделиться
  • 1
    проклятый слишком поздно, собирался опубликовать это. С той же ошибкой вы исправили в edit;) – JHBonarius 13 July 2018 в 21:05
col = (np.argmax(a[i])) % (a[i].shape[1])
row = (np.argmax(a[i])) // (a[i].shape[1])

Это также помогло

0
ответ дан Surabhi Amit Chembra 17 August 2018 в 12:09
поделиться

Вы можете использовать numpy.where , который вы можете обернуть в простой функции, соответствующей вашим требованиям:

def max_by_index(idx, arr):
    return np.where(arr[idx] == np.max(arr[idx]))

В действии:

>>> max_by_index(0, a)
(array([1], dtype=int64), array([2], dtype=int64))

Вы можете индексировать свой массив с этим результатом для доступа к максимальному значению:

>>> a[0][max_by_index(0, a)]
array([0.7])

Это вернет все местоположения максимального значения, если вам нужен только один вы можете заменить np.max на np.argmax.

2
ответ дан user3483203 17 August 2018 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: