2016-03-23 1 views
3

Je prends la sortie du paquet de poursuite numérique AUTO, et j'ai besoin de filtrer les résultats qui ont des valeurs négatives des variables, car ils sont non physiques. Donc, si je l'ai, par exemple:Numpy - supprimer des lignes de données avec des valeurs négatives

>>> a = np.array([[0,1,2,3,4],[-1,-0.5,0,0.5,1],[-3,-4,-5,0.1,0.2]]) 

Je voudrais être laissé:

>>> b 
array([[ 3. , 4. ], 
     [ 0.5, 1. ], 
     [ 0.1, 0.2]]) 

Mais quand j'essaie numpy.where je reçois:

>>> b = a[:,(np.where(a[1]>=0) and np.where(a[2]>=0))] 
>>> b 
array([[[ 3. , 4. ]], 

     [[ 0.5, 1. ]], 

     [[ 0.1, 0.2]]]) 
>>> b.shape 
(3, 1, 2) 

C'est, il ajoute un autre axe indésirable au tableau. Qu'est-ce que je fais mal?

+0

Vous colonnes entièrement positif, n'est-ce pas? – jrjc

Répondre

6

En supposant tout ce que vous voulez faire est de supprimer des colonnes qui ont une ou plusieurs valeurs négatives, vous pouvez le faire:

a = np.array([[0,1,2,3,4],[-1,-0.5,0,0.5,1],[-3,-4,-5,0.1,0.2]]) 
b = a[:,a.min(axis=0)>=0] 
1

Si ce que vous voulez sont des colonnes entièrement positives, puis @ la réponse de Yakym est la manière aller comme c'est probablement plus rapide. Cependant, si elle était juste un exemple et que vous voulez seuil certaines colonnes, vous pouvez le faire en modifiant sightly votre exemple:

>>> a[:, (a[1] >= 0) & (a[2] >= 0)] 
array([[ 3. , 4. ], 
     [ 0.5, 1. ], 
     [ 0.1, 0.2]]) 

Ici (a[1] >= 0) et (a[2] >= 2) créer un masque booléen qui sont unis par la & (booléen/logique et) opérateur et utilisé pour indexer le tableau a.