2017-10-21 19 views
0

J'ai un tableau: [[True], [False], [True]]. Si je veux que ce tableau filtre mon tableau existant, par exemple [[1,2],[3,4],[5,6]] devrait être filtré à [[1,2],[5,6]], quelle est la bonne façon de le faire?Tableaux de filtres dans Numpy

Une indexation a[b] simple donne l'erreur: boolean index did not match indexed array along dimension 1; dimension is 2 but corresponding boolean dimension is 1

+3

Utilisez 'a [b.ravel()]'. – Divakar

+0

Wow. C'était rapide. Merci. Ça marche! :) Veuillez voter pour fermer cette question en double si vous en trouvez un. Je ne pouvais pas –

Répondre

1

La solution est d'obtenir le tableau [[True], [False], [True]] en forme [True, False, True], de sorte que cela fonctionne pour indexer les lignes de l'autre réseau. Comme l'a dit Divakar, ravel fait cela; en général, il aplatit tout tableau dans un tableau 1D. Une autre option est squeeze qui supprime les dimensions avec la taille 1, mais laisse les autres dimensions comme ils l'étaient,

1

utilisation .ravel ...

De la documentation, ravel sera:

Return a contiguous flattened array.

Donc, si nous ont votre barray:

b = np.array([[True], [False], [True]]) 

nous pouvons prendre la boolean valeurs hors de leur sub-arrays avec:

b.ravel() 

qui donne:

array([ True, False, True], dtype=bool) 

Alors, nous pouvons simplement utiliser b.ravel() comme un masque pour a et il fonctionnera comme vous voulez:

a = np.array([[1,2], [3,4], [5,6]]) 
b = np.array([[True], [False], [True]]) 

c = a[b.ravel()] 

qui donne c comme:

array([[1, 2], 
     [5, 6]])