Tengo dos matrices 1D numpy de igual longitud, id
y data
, donde id
es una secuencia de repetición, ordenado números enteros que definen sub-ventanas en data
. Por ejemplo,Grupo por max o min en una matriz numpy
id data
1 2
1 7
1 3
2 8
2 9
2 10
3 1
3 -10
me gustaría a agregarse data
al agrupar en el id
y teniendo o bien el máximo o el min. En SQL, esta sería una consulta de agregación típica como SELECT MAX(data) FROM tablename GROUP BY id ORDER BY id
. ¿Hay alguna forma de evitar los bucles de Python y hacer esto de forma vectorializada, o tengo que bajar a C?
Gracias @Bago, esto ofrece un gran rendimiento. Otra cosa que encuentro útil aquí es que parece que lexsort siempre colocará valores NaN al final de las subventanas. Por lo tanto, si quiero encontrar, por ejemplo, el máximo de cada ventana excluyendo NaN, puedo voltear el signo de los datos, aplicar la fórmula mínima y luego voltear el signo nuevamente en el camino de salida, con solo una pequeña penalización de rendimiento. Por otro lado, si de hecho quiero que se devuelva un valor NaN si hay un NaN en alguna parte en la ventana secundaria, entonces lo dejo tal como está. – Abiel
Abiel, vea np.nanmax - max ignorando NaNs – denis
Buena solución. Es molesto que el tiempo O (n log n) y la memoria O (n), cuando sabemos que se puede resolver en el tiempo O (n) y la memoria O (k) para k bandejas. Quizás numpy debería ser compatible con 'binmax' y' bincount'. – joeln