Найти индекс максимального элемента в массиве numpy, исключая несколько индексов - PullRequest
0 голосов
/ 15 января 2020

Скажите:

p = array([4, 0, 8, 2, 7])

Хотите найти индекс максимального значения, за исключением нескольких индексов, скажем:

excptIndx = [2, 3]

Ответ: 4, так как 7 будет макс.

если excptIndx = [1, 3], ответ: 2, так как 8 будет макс.

Ответы [ 4 ]

3 голосов
/ 15 января 2020

В numpy вы можете замаскировать все значения на excptIndx и запустить argmax, чтобы получить индекс максимального элемента:

import numpy as np

p = np.array([4, 0, 8, 2, 7])
excptIndx = [2, 3]

m = np.zeros(p.size, dtype=bool)
m[excptIndx] = True
a = np.ma.array(p, mask=m)
print(np.argmax(a))
# 4
2 голосов
/ 15 января 2020

Настройка:

In [153]: p = np.array([4,0,8,2,7])                                                              
In [154]: exceptions = [2,3]                                                                     

Исходные индексы в p:

In [155]: idx = np.arange(p.shape[0])                                                            

delete исключения из обоих:

In [156]: np.delete(p,exceptions)                                                                
Out[156]: array([4, 0, 7])
In [157]: np.delete(idx,exceptions)                                                              
Out[157]: array([0, 1, 4])

Найти argmax в удаленном массиве:

In [158]: np.argmax(np.delete(p,exceptions))                                                     
Out[158]: 2

Используйте это, чтобы найти максимальное значение (можно также использовать np.max(_156)

In [159]: _156[_158]                                                                             
Out[159]: 7

Использовать тот же индекс, чтобы найти индекс в оригинале p

In [160]: _157[_158]                                                                             
Out[160]: 4
In [161]: p[_160]    # another way to get the max value                                                                            
Out[161]: 7

Для этого небольшого примера альтернативы pure Python вполне могут быть быстрее. Они часто бывают в небольших случаях. Нам нужны тестовые случаи с 1000 или более значениями, чтобы реально увидеть преимущества numpy.

Другой метод

Установите исключения на достаточно малое значение и возьмите argmax:

In [162]: p1 = p.copy(); p1[exceptions] = -1000                                                  
In [163]: np.argmax(p1)                                                                          
Out[163]: 4

Здесь small enough легко выбрать, в более общем случае это может потребовать некоторой мысли.

Или воспользоваться функциями np.nan...:

In [164]: p1 = p.astype(float); p1[exceptions]=np.nan                                            
In [165]: np.nanargmax(p1) 
Out[165]: 4
0 голосов
/ 15 января 2020
p = np.array([4,0,8,2,7])   # given
exceptions = [2,3]   # given

idx = list( range(0,len(p)) )   # simple array of index
a1 = np.delete(idx, exceptions)   # remove exceptions from idx (i.e., index)
a2 = np.argmax(np.delete(p, exceptions))   # get index of the max value after removing exceptions from actual p array

a1[a2]   # as a1 and a2 are in sync, this will give the original index (as asked) of the max value
0 голосов
/ 15 января 2020

Решение:

mask = np.isin(np.arange(len(p)), excptIndx)
subset_idx = np.argmax(p[mask])
parent_idx = np.arange(len(p))[mask][subset_idx]

См. http://seanlaw.github.io/2015/09/10/numpy-argmin-with-a-condition/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...