'ungültiger Wert in der Warnung double_scalars', möglicherweise numpy


75

Während ich meinen Code ausführe, erhalte ich diese Warnungen sporadisch immer in Vierergruppen. Ich habe versucht, die Quelle zu finden, indem ich Debug-Meldungen vor und nach bestimmten Anweisungen platzierte, um ihren Ursprung genau zu bestimmen.

Warning: invalid value encountered in double_scalars
Warning: invalid value encountered in double_scalars
Warning: invalid value encountered in double_scalars
Warning: invalid value encountered in double_scalars

Ist dies eine Numpy-Warnung und was ist ein doppelter Skalar?

Von Numpy benutze ich

min(), argmin(), mean() and random.randn()

Ich benutze auch Matplotlib


8
Ein doppelter Skalar ist ein Wert vom Typ double. Es wird Skalar genannt, um es in numpy von doppelten Arrays zu unterscheiden.
Muhammad Alkarouri

In meinem Fall gibt es in >>> numpy.array ([- 4.00000000e-01]) ** 1.49011611939e-08

Antworten:


56

Es sieht aus wie ein Gleitkomma-Berechnungsfehler. Überprüfen Sie die Funktion numpy.seterr , um weitere Informationen darüber zu erhalten, wo dies geschieht.


9
Verwenden Sie numpy.seterr('raise')diese Option, um bei Fehlern eine Ausnahme auszulösen.
Yariv

59

In meinem Fall fand ich heraus, dass es eine Division durch Null war.


2
Meine auch. Ich habe versucht, genau die gleichen Vektoren zu vergleichen und habe die Division durch Null erhalten
Chimpsarehungry

2
Oder den Mittelwert einer leeren Liste nehmen. Hoppla.
Matt

7
Würde eine Division durch Null nicht a erhöhen ZeroDivisionError?
jfn

4
@jfn normalerweise, aber numpy kann das manchmal in eine Warnung verwandeln, da technisch naneine gültige IEEE-Standardantwort auf die Division durch Null ist.
ocket8888

12

Manchmal erzeugen NaNs oder Nullwerte in Daten diesen Fehler mit Numpy. Wenn Sie Daten beispielsweise aus einer CSV-Datei oder ähnlichem aufnehmen und dann die Daten mit Numpy-Arrays bearbeiten, kann das Problem auf Ihre Datenerfassung zurückzuführen sein. Sie können versuchen, Ihrem Code einen kleinen Datensatz mit bekannten Werten zuzuführen und festzustellen, ob Sie das gleiche Ergebnis erhalten.


4
Ähnliches passierte mir, in meinem Fall rief ich die mittlere Funktion von numpy für ein leeres Array auf.
Alexander

Eine andere Sache, auf die Sie achten sollten ... Ich bekomme dies auch, wenn ich versuche, eine negative Zahl auf eine gebrochene Potenz zu erhöhen: ValueError: negative Zahl kann nicht auf eine gebrochene Potenz erhöht werden
Travis Vaught

7

Ein Array mit der Größe Null, das übergeben wird, numpy.meanlöst diese Warnung aus (wie in mehreren Kommentaren angegeben).

Für einige andere Kandidaten:

  • median Diese Warnung wird auch für Arrays mit der Größe Null ausgelöst.

andere Kandidaten erheben diese Warnung nicht:

  • min,argminbeide erhöhen ValueErrorauf leerem Array
  • randnnimmt *arg; using randn(*[])gibt eine einzelne Zufallszahl zurück
  • std,varRückkehr nanauf ein leeres Array

1

Ich bin auf ein ähnliches Problem gestoßen - Ungültiger Wert in ... Nachdem ich viel Zeit damit verbracht habe, herauszufinden, was diesen Fehler verursacht, glaube ich, dass er in meinem Fall auf NaN in meinem Datenrahmen zurückzuführen ist. Schauen Sie sich die Arbeit mit fehlenden Daten in Pandas an.

Keine == Keine Richtig

np.nan == np.nan False

Wenn NaN nicht gleich NaN ist, verursachen arithmetische Operationen wie Division und Multiplikation diesen Fehler.

Einige Dinge, die Sie tun können, um dieses Problem zu vermeiden:

  1. Verwenden Sie pd.set_option, um die Anzahl der Dezimalstellen festzulegen, die in Ihrer Analyse berücksichtigt werden sollen, damit eine unendlich kleine Zahl kein ähnliches Problem auslöst - ('display.float_format', Lambda x: '% .3f'% x).

  2. Verwenden Sie df.round (), um die Zahlen zu runden, damit Panda die verbleibenden Ziffern aus der Analyse entfernt. Und am wichtigsten,

  3. Setze NaN auf Null df = df.fillna (0). Seien Sie vorsichtig, wenn das Füllen von NaN mit Null nicht für Ihre Datensätze gilt, da dies den Datensatz als Null behandelt, sodass sich auch N im Mittelwert, Standard usw. ändert.


0

Wenn Sie mit CSV-Importen arbeiten, versuchen Sie, df.dropna () zu verwenden, um alle derartigen Warnungen oder Fehler zu vermeiden.


0

Ich erzähle dies, während ich rechnete np.var(np.array([])). np.varteilt die Größe des Arrays, die in diesem Fall Null ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.