Настройка:
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