La façon de groupe de lignes dans un Numpy 2D matrice basée sur les valeurs de la colonne?
Ce serait un moyen efficace (facile) de grouper un 2DNumPy des lignes de la matrice par une autre colonne (par exemple à un groupe par la colonne 2 valeurs) et en cours d'exécution f1() et f2() sur chacun de ces groupes?
Si vous avez un tableau arr de forme (rows, cols), vous pouvez obtenir le vecteur de toutes les valeurs dans la colonne 2 comme
col = arr[:,2]
Vous pouvez ensuite construire un booléen tableau avec votre groupement état, disons que le groupe 1 est composé de ces lignes ont une valeur supérieure à 5 dans la colonne 2:
idx = col >5
Vous pouvez appliquer ce booléen tableau directement à votre tableau original pour sélectionner les lignes:
Une solution compacte est d'utiliser numpy_indexed (disclaimer: je suis son auteur), qui met en œuvre entièrement vectorisé solution à ce type de problème:
La façon la plus simple de l'utiliser est:
import numpy_indexed as npi
npi.group_by(arr[:, col1]).mean(arr)
Mais cela fonctionne aussi:
# run function f1 on each group, formed by keys which are the rows of arr[:, [col1, col2]
npi.group_by(arr[:,[col1, col2]], arr, f1)
Salut Eelco! Malheureusement, je ne pourrais pas vous rejoindre sur certains autres. Regarde comme nous travaillons sur des projets similaires. Jetez un oeil à github.com/ml31415/numpy-groupies , c'est aussi un ensemble de grouper les opérations de numpy. Au lieu d'avoir deux projets similaires, il peut être judicieux de joindre leurs forces.
ou peut-être quelque chose comme
OriginalL'auteur Joran Beasley
Si vous avez un tableau
arr
de forme(rows, cols)
, vous pouvez obtenir le vecteur de toutes les valeurs dans la colonne 2 commeVous pouvez ensuite construire un booléen tableau avec votre groupement état, disons que le groupe 1 est composé de ces lignes ont une valeur supérieure à 5 dans la colonne 2:
Vous pouvez appliquer ce booléen tableau directement à votre tableau original pour sélectionner les lignes:
Par exemple:
OriginalL'auteur Jaime
Une solution compacte est d'utiliser numpy_indexed (disclaimer: je suis son auteur), qui met en œuvre entièrement vectorisé solution à ce type de problème:
La façon la plus simple de l'utiliser est:
Mais cela fonctionne aussi:
OriginalL'auteur Eelco Hoogendoorn