I ont le code ci-dessous dans le cadre d'une fonction:erreur relevée dans le code qui ne doit pas fonctionner selon l'évaluation paresseuse
px = x2 - x1
py = y2 - y1
pz = z2 - z1
div = px*px + py*py
u = ((x0 - x1) * px + (y0 - y1) * py)/div
la ligne retourne u=
RuntimeWarning: invalid value encountered in divide
lors de son exécution. C'est parce que parfois la ligne div=
renvoie zéro.
Cependant, si je réécris la ligne u=
comme:
u = np.where(div != 0, ((x0 - x1) * px + (y0 - y1) * py)/div, 0)
retourne toujours le même avertissement d'exécution.
Ce code génère les nombres désirés mais je pensais que la fonction np.where
était paresseuse. Si ce n'est pas le cas, il y a des accélérations potentielles dans d'autres parties du code que j'ai écrites (d'où je pose cette question). Qu'est-ce qui me manque? Est-ce que la fonction np.where
calcule à la fois les entrées 'Vrai' et 'Faux' et en sélectionne une en fonction du booléen?
Notez que ceci est la solution que j'ai fini avec:
np.seterr(invalid='ignore')
u = np.where(div != 0, ((x0 - x1) * px + (y0 - y1) * py)/div, 0)
np.seterr(invalid='warn')
bien que cela fonctionne bien aussi:
u = np.zeros_like(div)
divb = div != 0
u[divb] = ((x0[divb] - x1[divb]) * px[divb] +
(y0[divb] - y1[divb]) * py[divb])/div[divb]
(qui est un peu ce que je pensais np.where
fait ...
Ces deux solutions sont à peu près à la même vitesse mais les deux sont plus lentes que la seule fonction np.where
.
Toutes les explications/suggestions sont les bienvenues! Merci.
est 'div' un nombre à virgule flottante? – plonser
'np.where' ne met pas (et ne peut pas) implémenter une évaluation paresseuse. Tous ses arguments sont évalués (comme tous les arguments de toute fonction python) avant que la fonction ne soit appelée. –
@WarrenWeckesser, merci, devra changer certaines des choses que j'ai écrites. – Siyh