Was ist der beste Weg, dies mit NumPy, oder mit Python im Allgemeinen zu tun? Ich habe:
Der beste Weg ist der sicherste und auch der schnellste
Ich würde die Verwendung von Hypot für zuverlässige Ergebnisse vorschlagen, da die Wahrscheinlichkeit eines Unter- oder Überlaufs sehr gering ist, verglichen mit dem Schreiben eines eigenen sqroot-Rechners
Sehen wir uns math.hypot, np.hypot und vanilla an np.sqrt(np.sum((np.array([i, j, k])) ** 2, axis=1))
i, j, k = 1e+200, 1e+200, 1e+200
math.hypot(i, j, k)
# 1.7320508075688773e+200
np.sqrt(np.sum((np.array([i, j, k])) ** 2))
# RuntimeWarning: overflow encountered in square
Geschwindigkeitstechnisch sieht math.hypot besser aus
%%timeit
math.hypot(i, j, k)
# 100 ns ± 1.05 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%%timeit
np.sqrt(np.sum((np.array([i, j, k])) ** 2))
# 6.41 µs ± 33.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Unterlauf
i, j = 1e-200, 1e-200
np.sqrt(i**2+j**2)
# 0.0
Überlauf
i, j = 1e+200, 1e+200
np.sqrt(i**2+j**2)
# inf
Kein Unterlauf
i, j = 1e-200, 1e-200
np.hypot(i, j)
# 1.414213562373095e-200
Kein Überlauf
i, j = 1e+200, 1e+200
np.hypot(i, j)
# 1.414213562373095e+200
Siehe