J'ai un tableau et je veux sélectionner des lignes où j'ai une condition sur différentes colonnes de ces lignes en Python en utilisant NumPy. Par exemple, considérez ce tableau:

test_array = numpy.array(([1,2,3,5],[4,5,6,7],[7,8,9,4]))

Maintenant, je veux toutes les lignes où la colonne 1 est 1 et la colonne 4 est 5. La sortie doit donc être [1,2,3,5], seulement 1 ligne dans ce cas.

1
Aashish sharma Sharma 12 juil. 2015 à 23:48

4 réponses

Meilleure réponse

Vous pouvez utiliser l'approche suivante:

>>> test_array[np.where(np.all(test_array[:,[0,3]]==[1,5],axis=1))]
array([[1, 2, 3, 5]])
0
Kasramvd 12 juil. 2015 à 21:15

Si vous voulez qu'une fonction soit le critère des lignes, vous pouvez faire:

def filter(row):
    if row[0]==1 and row[3]==5:
        return True
    return False

out_array = test_array[numpy.array([filter(row) for row in test_array])]

numpy.array([filter(row) for row in test_array]) vous donne un tableau booléen correspondant aux lignes que vous voulez et à celles que vous ne voulez pas.

0
Pallav Agarwal 12 juil. 2015 à 21:16

L'indexation / masquage booléen fait parfaitement l'affaire

In [498]: test_array=np.array(([1,2,3,5],[4,5,6,7],[7,8,9,4]))

In [499]: I = (test_array[:,0]==1) & (test_array[:,3]==5)

In [500]: I
Out[500]: array([ True, False, False], dtype=bool)

In [501]: test_array[I,:]
Out[501]: array([[1, 2, 3, 5]])

Lors du calcul de I, utilisez librement () pour que les tests == aient la priorité sur &. Le test de Kasra fonctionnerait également: I = np.all(test_array[:,[0,3]]==[1,5],axis=1).

0
hpaulj 12 juil. 2015 à 21:16
[list(x) for x in test_array if x[0]==1 and x[3]==5]

Cela vous donne la sortie souhaitée:

[[1, 2, 3, 5]]

Pour un tableau comme celui-ci

test_array=numpy.array(([1,2,3,5],[4,5,6,7],[7,8,9,4],[1,98,76,5]))

Vous obtiendrez alors

[[1, 2, 3, 5], [1, 98, 76, 5]]

En supposant que vous appelez le résultat res, vous pouvez facilement accéder aux résultats. par exemple. res[1] serait alors [1, 98, 76, 5].

Si, pour une raison quelconque, vous souhaitez obtenir les deux nombres entre le 1 et le 5, vous pouvez utiliser

[sl[1:3] for sl in res]

Ce qui vous donnerait

[[2, 3], [98, 76]]

C'est bien ce que vous cherchiez?

1
Cleb 12 juil. 2015 à 21:32