Skip to content

NumPy : Extraire ou supprimer les éléments, les lignes et les colonnes qui satisfont les conditions

Cet article décrit comment extraire ou supprimer des éléments, des lignes et des colonnes qui satisfont à la condition du tableau NumPy ndarray.

  • Extraire les éléments qui satisfont aux conditions
  • Extraire les lignes et les colonnes qui satisfont aux conditions
    • Tous les éléments satisfont la condition :numpy.all()
    • Au moins un élément satisfait la condition :numpy.any()
  • Supprimer les éléments, les lignes et les colonnes qui satisfont aux conditions
    • Utiliser ~ (PAS)
    • Utilisez numpy.delete() et numpy.where()
  • Conditions multiples

Consultez l’article suivant pour un exemple lorsque ndarray contient des valeurs manquantes NaN.

Si vous souhaitez remplacer ou compter un élément qui remplit les conditions, consultez l’article suivant.

Si vous souhaitez extraire des éléments qui remplissent la condition, vous pouvez utiliser ndarray [expression conditionnelle].

Même si le ndarray d’origine est un tableau multidimensionnel, un tableau unidimensionnel aplati est renvoyé.

import numpy as np

a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(a < 5)
# [[ True  True  True  True]
#  [ True False False False]
#  [False False False False]]

print(a[a < 5])
# [0 1 2 3 4]

print(a < 10)
# [[ True  True  True  True]
#  [ True  True  True  True]
#  [ True  True False False]]

print(a[a < 10])
# [0 1 2 3 4 5 6 7 8 9]

Un nouveau ndarray est renvoyé et le ndarray d’origine reste inchangé. Il en est de même pour les exemples suivants.

b = a[a < 10]
print(b)
# [0 1 2 3 4 5 6 7 8 9]

print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

Il est possible de calculer la somme, la moyenne, la valeur maximale, la valeur minimale, l’écart type, etc., des éléments qui satisfont la condition.

print(a[a < 5].sum())
# 10

print(a[a < 5].mean())
# 2.0

print(a[a < 5].max())
# 4

print(a[a < 10].min())
# 0

print(a[a < 10].std())
# 2.8722813232690143

Extraire les lignes et les colonnes qui satisfont aux conditions

Dans l’exemple d’extraction d’éléments, un tableau unidimensionnel est renvoyé, mais si vous utilisez np.all() et np.any(), vous pouvez extraire des lignes et des colonnes tout en conservant la dimension ndarray d’origine.

Tous les éléments satisfont la condition :numpy.all()

np.all() est une fonction qui renvoie True lorsque tous les éléments de ndarray passés au premier paramètre sont True et renvoie False dans le cas contraire.

Si vous spécifiez le paramètre axis, il renvoie True si tous les éléments sont True pour chaque axe. Dans le cas d’un tableau à deux dimensions, le résultat est pour les colonnes lorsque l’axe=0 et pour les lignes lorsque l’axe=1.

print(a < 5)
# [[ True  True  True  True]
#  [ True False False False]
#  [False False False False]]

print(np.all(a < 5))
# False

print(np.all(a < 5, axis=0))
# [False False False False]

print(np.all(a < 5, axis=1))
# [ True False False]

print(a < 10)
# [[ True  True  True  True]
#  [ True  True  True  True]
#  [ True  True False False]]

print(np.all(a < 10, axis=0))
# [ True  True False False]

print(np.all(a < 10, axis=1))
# [ True  True False]

Les lignes et les colonnes sont extraites en donnant chaque résultat à [lignes, :] ou [:, colonnes]. Pour [lignes, :], le , : final peut être omis.

print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
#  [4 5]
#  [8 9]]

print(a[np.all(a < 10, axis=1), :])
# [[0 1 2 3]
#  [4 5 6 7]]

print(a[np.all(a < 10, axis=1)])
# [[0 1 2 3]
#  [4 5 6 7]]

Si la condition n’est pas remplie, un ndarray vide est renvoyé.

print(a[:, np.all(a < 5, axis=0)])
# []

Même si une seule ligne ou une seule colonne est extraite, le nombre de dimensions ne change pas.

print(a[np.all(a < 5, axis=1)])
# [[0 1 2 3]]

print(a[np.all(a < 5, axis=1)].ndim)
# 2

print(a[np.all(a < 5, axis=1)].shape)
# (1, 4)

Au moins un élément satisfait la condition :numpy.any()

np.any() est une fonction qui renvoie True lorsque ndarray passé au premier paramètre contient au moins un élément True, et renvoie False sinon.

Si vous spécifiez le paramètre axis, il renvoie True si au moins un élément est True pour chaque axe. Dans le cas d’un tableau à deux dimensions, le résultat est pour les colonnes lorsque l’axe=0 et pour les lignes lorsque l’axe=1.

print(a < 5)
# [[ True  True  True  True]
#  [ True False False False]
#  [False False False False]]

print(np.any(a < 5))
# True

print(np.any(a < 5, axis=0))
# [ True  True  True  True]

print(np.any(a < 5, axis=1))
# [ True  True False]

Vous pouvez extraire les lignes et les colonnes qui correspondent aux conditions de la même manière que np.all().

print(a[:, np.any(a < 5, axis=0)])
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
#  [4 5 6 7]]

Supprimer les éléments, les lignes et les colonnes qui satisfont aux conditions

Si vous souhaitez supprimer des éléments, des lignes ou des colonnes au lieu de les extraire en fonction des conditions, il existe les deux méthodes suivantes.

Utiliser ~ (PAS)

Si vous ajoutez l’opérateur de négation ~ à une condition, les éléments, lignes et colonnes qui ne satisfont pas à la condition sont extraits. Cela équivaut à supprimer des éléments, des lignes ou des colonnes qui satisfont à la condition.

print(a[~(a < 5)])
# [ 5  6  7  8  9 10 11]

print(a[:, np.all(a < 10, axis=0)])
# [[0 1]
#  [4 5]
#  [8 9]]

print(a[:, ~np.all(a < 10, axis=0)])
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(a[np.any(a < 5, axis=1)])
# [[0 1 2 3]
#  [4 5 6 7]]

print(a[~np.any(a < 5, axis=1)])
# [[ 8  9 10 11]]

Utilisez numpy.delete() et numpy.where()

Les lignes et les colonnes peuvent également être supprimées à l’aide de np.delete() et np.where().

Dans np.delete(), définissez le ndarray cible, l’index à supprimer et l’axe cible.

Dans le cas d’un tableau à deux dimensions, les lignes sont supprimées si axe=0 et les colonnes sont supprimées si axe=1.

print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(a, [0, 2], axis=0))
# [[4 5 6 7]]

print(np.delete(a, [0, 2], axis=1))
# [[ 1  3]
#  [ 5  7]
#  [ 9 11]]

Voir aussi l’article suivant pour np.delete().

np.where() renvoie l’index de l’élément qui satisfait la condition.

Dans le cas d’un tableau multidimensionnel, un tuple d’une liste d’indices (numéro de ligne, numéro de colonne) qui satisfait la condition pour chaque dimension (ligne, colonne) est retourné.

print(a < 2)
# [[ True  True False False]
#  [False False False False]
#  [False False False False]]

print(np.where(a < 2))
# (array([0, 0]), array([0, 1]))

print(np.where(a < 2)[0])
# [0 0]

print(np.where(a < 2)[1])
# [0 1]

Voir aussi l’article suivant pour np.where().

En combinant ces deux fonctions, vous pouvez supprimer les lignes et les colonnes qui satisfont la condition.

print(np.delete(a, np.where(a < 2)[0], axis=0))
# [[ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.delete(a, np.where(a < 2)[1], axis=1))
# [[ 2  3]
#  [ 6  7]
#  [10 11]]

print(a == 6)
# [[False False False False]
#  [False False  True False]
#  [False False False False]]

print(np.where(a == 6))
# (array([1]), array([2]))

print(np.delete(a, np.where(a == 6)))
# [ 0  3  4  5  6  7  8  9 10 11]

print(np.delete(a, np.where(a == 6)[0], axis=0))
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(np.delete(a, np.where(a == 6)[1], axis=1))
# [[ 0  1  3]
#  [ 4  5  7]
#  [ 8  9 11]]

Comme dans l’exemple ci-dessus, les lignes et les colonnes qui ont au moins un élément satisfaisant la condition sont supprimées. C’est la même chose que d’utiliser np.any().

Conditions multiples

Si vous souhaitez combiner plusieurs conditions, entourez chaque expression conditionnelle de () et utilisez & ou |.

print(a[(a < 10) & (a % 2 == 1)])
# [1 3 5 7 9]

print(a[np.any((a == 2) | (a == 10), axis=1)])
# [[ 0  1  2  3]
#  [ 8  9 10 11]]

print(a[:, ~np.any((a == 2) | (a == 10), axis=0)])
# [[ 0  1  3]
#  [ 4  5  7]
#  [ 8  9 11]]