0
votes

Python: Y a-t-il une fonction numpue qui prend d'un tableau lorsque le masque est vrai et un autre lorsque le masque est faux?

Je souhaite diviser un tableau numérateurs par un tableau dénominateurs , mais certains éléments dans dénominateurs peuvent être zéro. L'élément résultant de ces indices devrait également être nul. Existe-t-il une fonction dans Numpy qui choisit des éléments de numérateurs / dénominateurs où dénominateurs n'est pas zéro et d'un tableau de zéro sinon?

J'ai regardé le masquage booléen, mais cela prendrait plusieurs lignes, car je devrais masquer dénominateurs afin de ne pas obtenir d'erreurs de division par zéro, ainsi que du résultat dans l'ordre mettre ces éléments à zéro.

Je pourrais jurer que j'ai vu une telle fonction mais je ne le trouve plus.


2 commentaires

np.where ?


NP.Où et np.divide ont des problèmes; Reportez-vous à ceci Stackoverflow .com / questions / 26248654 / ... pour une réponse


3 Réponses :


0
votes
np.where(denominators!=0,nominators/denominators,0)

7 commentaires

La version "plus compacte" augmentera l'erreur


Pour nominateurs = np.array ([1, 2, 3, 4, 5]) et dénominateurs = np.array ([1, 0, 2, 0, 5]) Il renvoie tableau ([1., 0. 5,5, 0., 1.]) . Je viens de l'essayer littéralement.


Sans aucun avertissement? Parce que tout cela est inutile et vous pouvez simplement faire nominateurs / dénominateurs


Avec RuntiMewarning. Mais ce n'est pas une erreur, et cela renvoie le résultat souhaité.


Oui, mais op demande spécifiquement de ne pas le faire.


simplement nominateurs / dénominateurs retours tableau ([1., INF, 1.5, INF, 1.]) Ce qui n'est pas ce que OP veut obtenir, autant que je sache le question.


Ok, je reçois ton point. Je laisserai la deuxième approche avec une note adéquate cependant.



1
votes

Jetez un coup d'œil à np.divide < / code> . Vous pouvez utiliser une condition sur votre tableau de dénominateur dans le où paramètre pour mettre une condition sur la division: où = dénominateurs! = 0 . Cela gardera la valeur du premier tableau, cependant.

Vous pouvez utiliser le où paramètre tous ensemble, qui donne un avertissement et un 0 à la place où le dénominateur était 0.

Vous pouvez également créer un tableau de zéros ( np.zeros (forme) ) et donner cela comme une matrice à laquelle la méthode diviser doit écrire son résultat. En combinaison avec le paramètre où , cela donnera le résultat correct sans avertissement.


4 commentaires

Le paramètre de l'ufunc n'est pas une lambda


Ah merci @Madphysicist, a changé ma réponse.


Vous voudrez ! = 0 négatif est ok


De retour! : p



2
votes

Vous avez un certain nombre d'options disponibles:

  1. ufuncs comme np.divide code> prend en charge un où code> masque à la version numpie 1.7: p> XXX PRE> LI>

  2. Utilisez des tableaux masqués: P>

    quotients = np.empty(np.broadcast(numerators, denominators).shape)
    mask = ~denominators
    quotients[mask] = numerators[mask] / denominators[mask]
    quotients[mask] = 0
    
  3. Utilisez le masquage à la main. Ce sera plus d'une ligne, mais vous pouvez le transformer en fonction d'utilisation future: p>

    quotients = np.zeros(np.broadcast(numerators, denominators).shape)
    mask = ~denominators
    quotients[mask] = numerators[mask] / denominators[mask]
    


0 commentaires