J'essaie d'effectuer une division par élément en python, mais si un zéro est rencontré, j'ai besoin que le quotient soit juste zéro.
Par exemple:
array1 = np.array([0, 1, 2])
array2 = np.array([0, 1, 1])
array1 / array2 # should be np.array([0, 1, 2])
Je pourrais toujours utiliser une boucle for à travers mes données, mais pour vraiment utiliser les optimisations de numpy, j'ai besoin que la fonction de division renvoie 0 lors de la division par zéro erreur au lieu d'ignorer l'erreur.
Sauf si je manque quelque chose, il ne semble pas que numpy.seterr () puisse renvoyer des valeurs en cas d'erreurs. Quelqu'un a-t-il d'autres suggestions sur la façon dont je pourrais tirer le meilleur parti de numpy tout en définissant ma propre division par zéro gestion des erreurs?
Réponses:
Dans numpy v1.7 +, vous pouvez profiter de l'option "where" pour ufuncs . Vous pouvez faire des choses en une seule ligne et vous n'avez pas à vous occuper du gestionnaire de contexte errstate.
Dans ce cas, il effectue le calcul de division n'importe où «où» b n'est pas égal à zéro. Lorsque b est égal à zéro, il reste inchangé par rapport à la valeur que vous lui avez initialement donnée dans l'argument «out».
la source
a
et / oub
peut être des tableaux d'entiers, alors c'est le même concept, il vous suffit de définir explicitement le type de sortie correct:c = np.divide(a, b, out=np.zeros(a.shape, dtype=float), where=b!=0)
out=np.zeros_like(a)
est critique, comme indiqué dans la ligne commentée.np.divide(a, b, out=np.zeros_like(a), where=b!=0)
, j'obtiens l'erreurAssigning to function call which doesn't return
. La chose étrange est que je l'utilise deux fois et que l'erreur n'apparaît qu'une fois.S'appuyant sur la réponse de @Franck Dernoncourt, corrigeant -1/0:
la source
~
radiersTrue
etFalse
dans les tableaux numpy:print ~ np.array([ True, False, False ])
.c[ ~ np.isfinite( c )] = 0
signifie: trouver les positions oùc
est finie, inverser celles-ci en NON finies avec~
, et définir les valeurs non finies sur 0. Voir aussi stackoverflow.com/search?q=[numpyedral+"boolean+indexing "S'appuyer sur les autres réponses et améliorer:
0/0
manipulation en ajoutantinvalid='ignore'
ànumpy.errstate()
numpy.nan_to_num()
de convertirnp.nan
à0
.Code:
Production:
la source
0/0
ainsi que les1/0
erreurs.a
ou l' autreb
contientNaN
, votre solution donne soudainement0
en conséquence. Cela peut facilement masquer les erreurs dans votre code et est absolument inattendu.numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
est la signature.One-liner (jette un avertissement)
la source
Essayez de le faire en deux étapes. Division d'abord, puis remplacez.
La
numpy.errstate
ligne est facultative, et empêche simplement numpy de vous parler de l '"erreur" de division par zéro, puisque vous avez déjà l'intention de le faire et de gérer ce cas.la source
np.errstate(divide='ignore'):
divide='warn'
pourrait également être utile s'il / elle souhaitait toujours être notifié.Vous pouvez également remplacer basé sur
inf
, uniquement si les dtypes de tableau sont des flottants, selon cette réponse :la source
Une réponse que j'ai trouvée en recherchant une question connexe était de manipuler la sortie en fonction du fait que le dénominateur était zéro ou non.
Supposons
arrayA
etarrayB
ont été initialisés, maisarrayB
ont des zéros. Nous pourrions faire ce qui suit si nous voulons calculer enarrayC = arrayA / arrayB
toute sécurité.Dans ce cas, chaque fois que j'ai une division par zéro dans l'une des cellules, je règle la cellule pour qu'elle soit égale à
myOwnValue
, ce qui dans ce cas serait égal à zéroNote de bas de page: rétrospectivement, cette ligne est de toute façon inutile, puisqu'elle
arrayC[i]
est instanciée à zéro. Mais si c'était le casmyOwnValue != 0
, cette opération ferait quelque chose.la source
Une autre solution à mentionner:
la source