2016-08-12 4 views
2

Как я могу избавиться от цикла python for? t не является равномерно распределенным в целом (просто в простом примере). Решения с использованием панд также прекрасны.numpy vectorize max над сегментами массива

import numpy as np 

n = 100 
t = np.arange(n) 
y = np.arange(n) 
edges = np.array([2., 5.5, 19, 30, 50, 72, 98]) 

indices = np.searchsorted(t, edges) 

maxes = np.zeros(len(edges)-1) 
for i in range(len(edges)-1): 
    maxes[i] = np.max(y[indices[i]:indices[i+1]]) 

print(maxes) 

Update: Я думаю reduceat может это сделать, но я не понимаю синтаксис.

+0

FYI: Вы можете упростить 'индексы = np.searchsorted (т, ребра)' в 'индексы = np.ceil (ребра) .astype (INT)'. Это намного эффективнее, и вам не нужно 't'. –

+0

@WarrenWeckesser благодарит за предложение. В фактическом примере использования t представляет собой неравномерно распределенную поплавковую матрицу, поэтому я считаю, что требуется поиск – user2133814

ответ

3

reduat выполняет работу красиво. Я не знал об этой функциональности 30 минут назад.

maxes = np.maximum.reduceat(y, indices)[:-1] 
Смежные вопросы