2017-05-23 2 views
0

J'ai un tableau numpy comme ceci:Comment un tableau NumPy de booléens peut-il être utilisé pour supprimer/filtrer des lignes d'un autre tableau NumPy?

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

Je veux utiliser ce tableau pour filtrer les lignes d'un autre tableau comme celui-ci:

array([[-0.45556594, 0.46623859], 
     [-1.80758847, -0.08109728], 
     [-0.9792373 , -0.15958186], 
     [ 4.58101272, -0.02224513], 
     [-1.64387422, -0.03813 ], 
     [-1.8175146 , -0.07419429], 
     [-1.15527867, -0.1074057 ], 
     [-1.48261467, -0.00875623], 
     [ 2.23701103, 0.67834847], 
     [ 1.45440669, -0.62921477], 
     [-1.13694557, 0.07002631], 
     [ 1.0645533 , 0.21917462], 
     [-0.03102173, 0.18059074], 
     [-1.16885461, -0.06968157], 
     [-0.51789417, -0.05855351], 
     [ 4.23881128, -0.30072904], 
     [-1.37940507, -0.06478938]]) 

Appliquer le filtre résulterait dans le tableau ci-dessous, avec seulement les trois premières lignes:

array([[-0.45556594, 0.46623859], 
     [-1.80758847, -0.08109728], 
     [-0.9792373 , -0.15958186]]) 

Comment cela peut-il être fait? Lorsque je tente de faire quelque chose comme B[A], où A est le tableau de filtre et B est l'autre, je reçois seulement la première colonne.

+1

Utiliser 'version 1D' de' A': 'B [A.ravel()]' . – Divakar

Répondre

1

Vous essayez de sélectionner des lignes entières, vous devez donc utiliser un tableau 1 dimension pour sélectionner. Comme mentionné dans les commentaires que vous pouvez utiliser numpy.ravel() pour redresser votre tableau de bool et l'appliquer à b avec:

b[a.ravel()] 

Vous pouvez également sélectionner explicitement la première colonne de a et l'appliquer à b avec:

b[a[:, 0]]) 

code d'essai:

a = np.array(
    [[ True], 
    [ True], 
    [ True], 
    [False], 
    [False], 
    [False]], dtype=bool) 

b = np.array(
    [[-0.45556594, 0.46623859], 
    [-1.80758847, -0.08109728], 
    [-0.9792373 , -0.15958186], 
    [ 4.58101272, -0.02224513], 
    [-1.64387422, -0.03813 ], 
    [-1.37940507, -0.06478938]]) 

print(b[a.ravel()]) 
print(b[a[:, 0]]) 

Résultats:

[[-0.45556594 0.46623859] 
[-1.80758847 -0.08109728] 
[-0.9792373 -0.15958186]] 

[[-0.45556594 0.46623859] 
[-1.80758847 -0.08109728] 
[-0.9792373 -0.15958186]] 
0

Vous pouvez également utiliser np.where pour trouver des indices de ligne éligibles:

b[np.where(a)[0]]