Ho due array 1D NumPy uguale lunghezza, e id
data
, dove id
è una sequenza di ripetizione, ordinato interi che definiscono sottofinestre su data
. Ad esempio,gruppo da massima o minima in una matrice NumPy
id data
1 2
1 7
1 3
2 8
2 9
2 10
3 1
3 -10
Vorrei aggregare data
raggruppando in id
e prendendo sia il massimo o minimo. In SQL, questa sarebbe una tipica query di aggregazione come SELECT MAX(data) FROM tablename GROUP BY id ORDER BY id
. C'è un modo per evitare i loop di Python e farlo in modo vettorializzato, o devo scendere a C?
Grazie a @Bago, questo offre grandi prestazioni. Un'altra cosa che trovo utile qui è che sembra che lexsort metterà sempre i valori NaN alla fine delle sottofinestre. Quindi, se voglio trovare, per esempio, il massimo di ciascuna finestra escludendo NaN, posso capovolgere il segno dei dati, applicare la formula min, e quindi capovolgere il segno di nuovo sulla via d'uscita, con solo una piccola penalizzazione delle prestazioni. D'altra parte, se in realtà desidero che venga restituito un valore NaN se c'è un NaN in qualsiasi punto della sottofinestra, allora lo lascio così com'è. – Abiel
Abiel, vedere np.nanmax - max ignorando NaNs – denis
Soluzione piacevole. È fastidioso il tempo O (n log n) e la memoria O (n), quando sappiamo che può essere risolto in tempo O (n) e memoria O (k) per k bin. Forse numpy dovrebbe supportare 'binmax' e' bincount'. – joeln