Как найти индекс и максимальное значение для перекрывающихся массивов - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть два массива с одинаковыми фигурами.Один со значениями и один с "зонами".Мне нужно найти максимальное значение и индекс значения в valueearr, которые перекрывают зону 3 в zonearr:

import numpy as np
valuearr = np.array([[10,11,12,13],
                     [21,22,23,24],
                     [31,32,33,34],
                     [41,42,43,44]])

zonearr = np.array([ [0,0,1,1],
                     [0,0,1,1],
                     [3,3,0,0],
                     [3,3,0,0]])

Я пытаюсь:

valuearr[np.argwhere(zonearr==3)].max()
44

Когда это должно быть 42.

Чтобы получить индекс, я пытаюсь

ind = np.unravel_index(np.argmax(valuearr[np.argwhere(zonearr==3)], axis=None), valuearr.shape)

Что, конечно, не работает, поскольку максимальное значение не равно 44, а также выдает ошибку:

builtins.ValueError: индекс 19 отсутствуетграниц для массива размером 16

Ответы [ 2 ]

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

Вы можете использовать маскированный массив, чтобы делать то, что вы хотите.

С:

import numpy as np
valuearr = np.array([[10,11,12,13],
                     [21,22,23,24],
                     [31,32,33,34],
                     [41,42,43,44]])

zonearr = np.array([ [0,0,1,1],
                     [0,0,1,1],
                     [3,3,0,0],
                     [3,3,0,0]], dtype=np.int)

Сначала замаскируйте все значения, где zonearr не равно 3:

masked = np.ma.masked_array(valuearr, mask = (zonearr!=3))

Затем найдите положение максимального значенияс помощью argmax:

idx_1d = np.argmax(masked)

Наконец, преобразуйте его в двумерный индекс:

idx_2d = np.unravel_index(idx_1d, valuearr.shape)

и напечатайте:

print(idx_2d, valuearr[idx_2d])

, что дает:

(3, 1) 42
0 голосов
/ 08 февраля 2019

Пожалуйста, попробуйте следующий код

np.max(valuearr[np.where(zonearr==3)])

Извлекает индексы элементов из zonearr, где значение равно «3».Затем следует получение максимального элемента из valuearr через полученные индексы.

Чтобы получить индекс элемента 42 (согласно вашему примеру), используйте следующий код:

np.argwhere(valuearr==np.max(valuearr[np.where(zonearr==3)]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...