Вы можете использовать лямбда-выражение, чтобы сократить время операции. Лямбда будет работать на секунду быстрее для вашего примера.
result = list(map(lambda x : max(vals[np.where(index_list == x)]),unique_index))
РЕДАКТИРОВАТЬ
После предложения shadownRanger для подхода к пониманию списка.
Я сравнил все 3 способа, чтобы увидеть, что быстрее.
import numpy as np
from datetime import datetime
# Randomly draw 100,000 integers between 1 and 100,000 as an example
index_list = np.random.randint(low=1, high=100000, size=100000)
# The data array being indexed
vals = np.linspace(1.,100000.,100000)
unique_index = np.unique(index_list)
time1 = datetime.now()
biggest = []
for line in unique_index:
biggest = np.append(biggest,max(vals[np.where(index_list == line)]))
time2 = datetime.now()
print ('time diff with for loop =', time2-time1)
time1 = datetime.now()
with_list_comprehension = [max(vals[np.where(index_list == x)]) for x in unique_index]
time2 = datetime.now()
print ('time diff with list comprehension =', time2-time1)
time1 = datetime.now()
lambda_way = list(map(lambda x : max(vals[np.where(index_list == x)]),unique_index))
time2 = datetime.now()
print ('time diff with map lambda =', time2-time1)
И результаты следующие.
time diff с for loop = 0:00: 05.194609
разница во времени с пониманием списка = 0: 00: 04.133024
разница во времени с лямбда-картой = 0: 00: 04.120000