J'ai besoin d'écrire une fonction qui détectera si l'entrée contient au moins une valeur non numérique. Si une valeur non numérique est trouvée, je soulèverai une erreur (car le calcul ne doit renvoyer qu'une valeur numérique). Le nombre de dimensions du tableau d'entrée n'est pas connu à l'avance - la fonction doit donner la valeur correcte indépendamment de ndim. Comme complication supplémentaire, l'entrée peut être un flottant unique numpy.float64
ou même quelque chose de bizarre comme un tableau à zéro dimension.
La manière évidente de résoudre ce problème est d'écrire une fonction récursive qui itère sur chaque objet itérable dans le tableau jusqu'à ce qu'elle trouve un non-itérabe. Il appliquera la numpy.isnan()
fonction sur chaque objet non itérable. Si au moins une valeur non numérique est trouvée, la fonction retournera immédiatement False. Sinon, si toutes les valeurs de l'itérable sont numériques, il renverra finalement True.
Cela fonctionne très bien, mais c'est assez lent et je pense que NumPy a une bien meilleure façon de le faire. Quelle est une alternative plus rapide et plus insensée?
Voici ma maquette:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
array(['None', 'None'], dtype=object)
? Une telle entrée devrait-elle simplement soulever une exception?
float('nan') in x
. Ça ne marche pas.
contains_nan
semble suspecte: "Renvoie false s'il existe au moins une valeur non numérique". Je me serais attenducontains_nan
à revenirTrue
si le tableau contient NaN.