Je dois é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 lèverai une erreur (parce que 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 devrait donner la valeur correcte indépendamment de ndim. Pour compliquer encore les choses, l'entrée pourrait être un simple flotteur ou un tableau de numpy.float64
ou même quelque chose de bizarre comme un tableau à zéro dimension.
La façon la plus évidente de résoudre ce problème est d'écrire une fonction récursive qui passe en revue tous les objets itérables du tableau jusqu'à ce qu'elle trouve un objet non itérable. Elle appliquera la méthode numpy.isnan()
sur chaque objet non itérable. Si au moins une valeur non numérique est trouvée, la fonction renvoie immédiatement False. Dans le cas contraire, si toutes les valeurs de l'objet itérable sont numériques, la fonction renverra finalement True.
Cela fonctionne très bien, mais c'est assez lent et je m'attends à ce que cela soit le cas. NumPy a une bien meilleure façon de procéder. Quelle est l'alternative la plus rapide et la plus proche de numpy ?
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