python: obtenir autour de division par zéro
J'ai un grand ensemble de données sur les nombres en virgule flottante. Je itérer et de les évaluer np.log(x) pour chacun d'eux.
Je reçois
RuntimeWarning: divide by zero encountered in log
Je tiens à les contourner et revenir à 0 si cette erreur se produit.
Je pense de définir une nouvelle fonction:
def safe_ln(x):
#returns: ln(x) but replaces -inf with 0
l = np.log(x)
#if l = -inf:
l = 0
return result
Essentiellement, j'ai besoin d'un moyen de vérifier que la sortie est "-inf" mais je ne sais pas comment procéder.
Merci pour votre aide!
Je voudrais commencer par le renvoi d'une variable réelle à la place de l'inexistant
désolé, j'ai juste écrit ce que un exemple 🙂
En raison de la façon dont votre question qui est écrit ("parcourir le tableau"), je pense que vous n'êtes pas à l'aide de NumPy correctement, et ce que vous faites (et la solution retenue) sont de plusieurs ordres de grandeur inférieure à celle de la solution courante.
est votre entrée à partir d'un tableau numpy (qui est: l'argument de x dans
result
désolé, j'ai juste écrit ce que un exemple 🙂
En raison de la façon dont votre question qui est écrit ("parcourir le tableau"), je pense que vous n'êtes pas à l'aide de NumPy correctement, et ce que vous faites (et la solution retenue) sont de plusieurs ordres de grandeur inférieure à celle de la solution courante.
est votre entrée à partir d'un tableau numpy (qui est: l'argument de x dans
safe_ln
une valeur à partir d'un tableau numpy?OriginalL'auteur Julia | 2012-11-21
Vous devez vous connecter pour publier un commentaire.
Depuis le
log
pourx=0
est moins l'infini, je serais tout simplement vérifier si la valeur d'entrée est égale à zéro et de retour que vous souhaitez:MODIFIER: petit edit: vous devriez vérifier pour toutes les valeurs égales ou inférieures à 0.
EDIT 2:
np.log
est bien sûr une fonction pour calculer sur un tableau numpy, pour les valeurs uniques vous devez utilisermath.log
. C'est de cette façon la fonction ci-dessus ressemble avec numpy:x
est à partir de la question.Vous avez raison, j'ai corrigé ma réponse.
Chacun de vos
safe_ln
faire autre chose (le dernier retourne -inf xi de x si x <= 0)Vous avez raison, j'ai besoin de o clip d'une valeur supérieure à 0.
OriginalL'auteur Constantinius
Vous utilisez un np de la fonction, de sorte que je peux deviner que vous travaillez sur un tableau numpy?
Ensuite, le moyen le plus efficace pour ce faire est d'utiliser la où la fonction au lieu d'une boucle for
sinon, vous pouvez simplement utiliser la fonction log et puis patcher le trou:
De la np.journal de retour de la fonction correctement -inf lorsqu'il est utilisé sur une valeur de 0, de sorte que vous êtes sûr que vous voulez retourner un 0? si, quelque part, vous devez revenir à la valeur initiale, vous allez rencontrer un problème, la modification de zéros en...
np.where
au lieu dewhere
. Pour moi c'est comme deux ordres de grandeur plus rapide, même pour de petits tableaux.Je me sens @EnricoGiampieri l'approche est plus correct que la réponse vous l'avez accepté. Belle illustration de numpy.où(), btw 🙂
Vous avez raison, je l'ai eu tort de travail avec le "from numpy import *" 😉 Pour le gain en vitesse, la puissance de numpy: aussi longtemps que vous restez à l'intérieur, il fonctionne à C de vitesse. Si vous voulez vous sentir une véritable explosion de puissance, essayer de le combiner avec la numexpr bibliothèque, optimiser pour le cache et multi-processeurs 😉 * à partir de numexpr importation évaluer ev * ev("où(montableau>0, np.log(myarray), 0)")
numexpr est incroyable ce qu'il fait. Dans ce cas, il commence à être plus rapide que numpy pour des matrices de taille 1000, et finit par être 8 fois plus rapide autour de 1e5 éléments, dans mon ordinateur portable. (En passant, il convient de
log
à l'intérieur de la chaîne de l'expression, pasnp.log
, numexpr n'est pas vraiment à l'aide de la fonction log de numpy)C'est une idée fausse commune au sujet de la où la fonction. Il fait créer à la fois tableau, l'un pour le cas positif et le négatif, et seulement ensuite, sélectionnez chaque élément de la. aussi étrange et de l'onu-optimal car il son, il est nécessaire si l'une de la matrice a des valeurs qui dépendent l'un de l'autre, comme un cumsum. Pour ne pas mentionner que vous passez à la fonction de la déjà généré de tableau, pas une fonction pour générer un...
OriginalL'auteur EnricoGiampieri
Vous pouvez le faire.
l
plutôt que de retourner la valeur de votre choix?OriginalL'auteur Jeff
utiliser la gestion des exceptions:
c'était juste un exemple, la solution de mise à jour.
Mmm, ce n'est pas de répondre à la question.
va vous expliquer comment?
Vous êtes en train de faire ce que la 2ème edition de la accepté de répondre, ce qui n'est pas ce que l'OP est de poser des questions, mais sans utiliser numpy, de sorte qu'il sera aussi beaucoup plus lent (numpy) des tableaux.
OriginalL'auteur Ashwini Chaudhary
que vous pouvez faire:
OriginalL'auteur Cameron Sparr
La réponse donnée par Enrico est agréable, mais les deux solutions un avertissement:
Comme alternative, nous pouvons toujours utiliser le
where
fonction, mais seulement d'exécuter le calcul principale où il est approprié:Mon cas d'utilisation a été pour la division, mais le principe est clairement la même chose:
OriginalL'auteur Bonlenfum