supprimer des paires d'éléments de tableaux numpy qui sont NaN (ou une autre valeur) dans Python
J'ai un tableau avec deux colonnes dans numpy. Par exemple:
a = array([[1, 5, nan, 6],
[10, 6, 6, nan]])
a = transpose(a)
Je veux efficacement itérer sur les deux colonnes, a[:, 0] et a[:, 1] et supprimez les paires de répondre à une certaine condition, dans ce cas, si ils sont NaN. Le moyen le plus évident, je pense:
new_a = []
for val1, val2 in a:
if val2 == nan or val2 == nan:
new_a.append([val1, val2])
Mais qui semble maladroit. Quelle est la pythonic numpy façon de faire cela?
grâce.
source d'informationauteur user248237dfsf
Vous devez vous connecter pour publier un commentaire.
Si vous voulez prendre uniquement les lignes qui n'ont pas de NANs, c'est l'expression que vous avez besoin de:
Si vous voulez que les lignes qui n'ont pas un nombre spécifique parmi ses éléments, par exemple, 5:
Ce dernier est clairement équivalent à
Explication:
Nous allons tout d'abord créer votre exemple d'entrée
Ce qui détermine quels sont les éléments NAN
Cela permet d'identifier les lignes qui ont tout élément qui sont de Véritables
Car nous ne voulons pas de ces, nous inversons la dernière expression:
Et enfin, nous utilisons le booléen tableau pour sélectionner les lignes que nous voulons:
Vous pouvez convertir le tableau en un masqué tableauet l'utilisation de la
compress_rows
méthode:Ne pas nuire à ig0774 de réponse, ce qui est parfaitement valide et Pythonic et est en fait la manière normale de faire ces choses dans la plaine de Python, mais: numpy prend en charge un booléen système d'indexation qui pourrait aussi faire le travail.
Je ne suis pas sûr désinvolte qui serait plus efficace (ou plus rapide à exécuter).
Si vous souhaitez utiliser un autre état pour sélectionner les lignes, ce devait être changé, et précisément comment dépend de la condition. Si c'est quelque chose qui peut être évaluée pour chaque élément du tableau de manière indépendante, vous pouvez simplement remplacer le
a==a
avec le test approprié, par exemple pour éliminer toutes les lignes avec des nombres supérieurs à 100 que vous pourriez faireMais si vous essayez de faire quelque chose de fantaisie qui implique tous les éléments dans une rangée (comme l'élimination de toutes les lignes d'un montant total de plus de 100), il pourrait être plus compliqué. Si c'est le cas, je peux essayer de modifier dans un sens plus spécifique de la réponse si vous voulez partager votre condition exacte.
Je pense que interprétations de la liste devrait le faire. E. g.,