4 votes

comparaisons arithmétiques sur les tableaux numpy

>>> import numpy as np
>>> x = np.eye(3)
>>> x[1, 2] = .5
>>> x
array([[ 1. ,  0. ,  0. ],
       [ 0. ,  1. ,  0.5],
       [ 0. ,  0. ,  1. ]])
>>> 0 < x.any() < 1
False
>>> 

Je voudrais vérifier si un tableau numpy contient une valeur entre 0 et 1.
Je lis 0 < x.any() < 1 comme "s'il existe un élément dont la taille est supérieure à 0 et inférieure à 1, retourner vrai", mais ce n'est évidemment pas le cas.

Comment faire une comparaison arithmétique sur un tableau numpy ?

2voto

Dougal Points 15023
>>> np.any((0 < x) & (x < 1))
True

Quoi x.any() fait en réalité : c'est la même chose que np.any(x) ce qui signifie qu'il renvoie True si des éléments dans x sont non nuls. Donc votre comparaison est 0 < True < 1 ce qui est faux car dans python 2 0 < True est vrai, mais True < 1 ne l'est pas, puisque True == 1 .

Dans cette approche, en revanche, nous créons des tableaux booléens indiquant si la comparaison est vraie pour chaque élément, puis nous vérifions si un élément de ce tableau est vrai :

>>> 0 < x
array([[ True, False, False],
       [False,  True,  True],
       [False, False,  True]], dtype=bool)
>>> x < 1
array([[False,  True,  True],
       [ True, False,  True],
       [ True,  True, False]], dtype=bool)
>>> (0 < x) & (x < 1)
array([[False, False, False],
       [False, False,  True],
       [False, False, False]], dtype=bool)

Vous devez faire l'explicitation & car malheureusement, numpy ne fonctionne pas (et je pense qu'il ne peut pas fonctionner) avec le chaînage intégré des opérateurs de comparaison de python.

1voto

shx2 Points 14025

Votre code est d'abord testé x.any() ce qui donne True comme x comprend une valeur non nulle. Il teste ensuite 0 < True (=1) < 1 qui est False . Faites :

((0 < x) & (x < 1)).any()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X