RuntimeWarning: Division durch Null-Fehler -: Wie vermeiden? PYTHON, NUMPY
Läuft bei mir in RuntimeWarning: Invalid value encountered in teilen
import numpy
a = numpy.random.rand((1000000, 100))
b = numpy.random.rand((1,100))
dots = numpy.dot(b,a.T)/numpy.dot(b,b)
norms = numpy.linalg.norm(a, axis =1)
angles = dots/norms ### Basically I am calculating angle between 2 vectors
Gibt es einige Vektoren in meine eine, die norm als 0. während also die Berechnung von Winkeln es gibt Laufzeit-Warnung.
Gibt es einen ein-Zeilen-pythonic Weg, um zu berechnen, Winkel, während unter Berücksichtigung der Normen, welche sind Sie 0?
angles =[i/j if j!=0 else -2 for i,j in zip(dots, norms)] # takes 10.6 seconds
Aber es braucht eine Menge Zeit. Da alle Winkel werden Werte zwischen 1 und -1 und ich brauche nur 10 max-Werte, dies wird mir helfen. Dies dauert rund 10,6 Sekunden, das ist Wahnsinn.
Sie können filter Normen, vor der übergabe?
Nein, ich möchte die Erhaltung der Indizes, weil ich will, Indizes der 10 größten Winkel in den enden, die weiter abgestimmt, die in eine andere Liste. So erhalten Indizes ist ein muss für mich.
Mit dem code, den du gepostet hast, die
Ich möchte bestimmten Wert an der Stelle, wo NaN ist aufgetreten. So kann ich manipulieren, während die Sortierung.
nans Art höher als alles andere, so, wenn Sie die Sortierung können Sie nur Streifen die top np.count_nonzero(np.isnan(d....ravel()) Werte
Nein, ich möchte die Erhaltung der Indizes, weil ich will, Indizes der 10 größten Winkel in den enden, die weiter abgestimmt, die in eine andere Liste. So erhalten Indizes ist ein muss für mich.
Mit dem code, den du gepostet hast, die
angles
variable wird NaNs, wo norms
null ist. Ist nicht, was Sie wollen? Beachten Sie, dass, wenn Sie wollen None
statt NaN
sind, dann werden Sie brauchen, um angles
von dtype object
, das ist schlecht für die Leistung... (es ist Auch möglich, nur unterdrücken RuntimeWarnings. Ist es das, was Sie wollen?)Ich möchte bestimmten Wert an der Stelle, wo NaN ist aufgetreten. So kann ich manipulieren, während die Sortierung.
nans Art höher als alles andere, so, wenn Sie die Sortierung können Sie nur Streifen die top np.count_nonzero(np.isnan(d....ravel()) Werte
InformationsquelleAutor pg2455 | 2014-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie ignorieren warings mit der
np.errstate
Kontext-manager und später ersetzen nans, was Sie wollen:wo ist eine Funktion in numpy, es ist nicht eine Methode, ein ndarray
my bad.. ich sollte schlafen b4 Arbeit weiter. Vielen Dank für Eure Hilfe!!
InformationsquelleAutor jtaylor
Wollen Sie sein, mit
np.where
. Finden Sie die Dokumentation.Winkel aus
downs/norms
wennnorms != 0
, und werden -2 sonst. Sie bekommen noch die RuntimeWarning, alsnp.where
noch berechnen den gesamten Vektordots/norms
intern, aber Sie können ihn getrost ignorieren.Wenn Sie python interaktiv (z.B. ipython) dann glaube ich wird es nur dann geben Sie die Warnung einmal pro Sitzung. Sie können auch fügen Sie immer
np.errstate(divide='ignore')
als jtaylor vorgeschlagen, um zu unterdrücken der Warnung in der Zukunft.InformationsquelleAutor Roger Fan
Könnten Sie
angles[~np.isfinite(angles)] = ...
zu ersetzennan
Werte mit einem anderen Wert.Beispiel:
Beachten Sie, dass die division durch null führen kann
inf
s, anstattnan
s,so ist es besser, rufen Sie
np.isfinite
eher alsnp.isnan
zu identifizieren die stellen, an denen die division durch null.Beachten Sie, dass wenn Sie nur wollen, die top-ten-Werte aus ein NumPy-array, mit der
np.argpartition
Funktion schneller als vollständig Sortierung der gesamten Arrays, insbesondere für große arrays:Dies zeigt
np.argpartition
ist schneller, selbst für nur mäßig große arrays:InformationsquelleAutor unutbu
In neueren Versionen von numpy gibt es eine Dritte alternative, option, die vermeidet, dass zu verwenden, die errstate Kontext-manager.
Alle Numpy ufuncs akzeptieren einen optionalen "wo" - argument. Dies wirkt sich etwas anders als die np.wo die Funktion ist, dass es nur wertet die Funktion "wo" die Maske ist wahr. Wenn die Maske ist Falsch, es ändert sich nicht der Wert, ist also die "out" - argument kann uns preallocate alle Standard wir wollen.
InformationsquelleAutor DStauffman
Können Sie
np.where( Bedingung )
zur Durchführung einer bedingten Scheibe, wo die Normen nicht gleich 0 vor der Teilung:aktualisiert.
InformationsquelleAutor agconti