Problem mit leerem Array

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hallo Zusammen,

folgende Fehlermeldung treibt mich zur Verzweiflung:
zero-size array to reduction operation minimum which has no identity

Code: Alles auswählen

y_ind = where(y_vec <= 3)
if len(y_ind) != 0:
y_ind= max(y_ind)
Das Code Schnippsel soll ausgeben an welcher Stelle die Amplitude das letze mal kleiner oder gleich 3 ist.

Dachte mir wenn der y_vec keinen Wert hat der dem Kriterium entspricht, dann ist y_ind halt leer.
Damit ist die Vektorlänge des Tupel gleich 0. Die If-Abfrage funktioniert nur leider nicht .... laufe trotzdem immer in die Fehlermeldung.

Freundliche Grüße
Inco
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: wie hast Du numpy importiert? Das sieht schwer nach *-Import aus, was bei numpy eine unübersichtliche Anzahl an Funktionen, die schon standardmäßig definiert sind, überschreibt. Schau Dir mal in der Dokumentation an, was der Rückgabewert von numpy.where ist, dann, was len(y_ind) oder max(y_ind) ist.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Da für mich Performance beim ausführen sehr wichtig ist, habe ich nur die Pakete importiert die ich benötige.
Also:

Code: Alles auswählen

from numpy import where, max, min
Sollte ich besser nur numpy importieren?

Hab mir eben die Rückgabewerte angesehen ... verstehe die where funktion nicht ... gibt es Alternativen :lol:
BlackJack

@incoggnito: In Deinem Fall ist ``np.where(A <= 3)`` äquivalent zu ``(A <= 3).nonzero()``. Das ist nämlich das was `where()` hier macht. Also musst Du `numpy.nonzero()` verstehen. :-)
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hab das mal eben getestet, der Code ist scheinbar nicht identisch, da ich nun folgende Fehlermeldung bekomme:
AttributeError: 'tuple' object has no attribute 'nonzero'
Hab außerdem die Funktion extract versucht --> gleicher Fehler s.o.
Auch ob ich numpy direkt lade oder die Pakete einzeln zeigt keinen Unterschied
BlackJack

@incoggnito: Das kann nicht sein denn bei dem Vergleich ``A <= 3`` kommt ziemlich sicher kein Tupel bei heraus wenn `A` ein Numpy-Array ist.

Code: Alles auswählen

In [15]: A
Out[15]: array([1, 2, 2, 3, 2, 2, 4])
In [16]: np.where(A <= 2)
Out[16]: (array([0, 1, 2, 4, 5]),)
In [17]: (A <= 2).nonzero()
Out[17]: (array([0, 1, 2, 4, 5]),)
Schau Dir Typ und Wert von `y_ind` in Deinem Code doch mal an und was `where()` bzw. `nonzero()` als Datentyp und Wert zurückgeben. Ein `max()` direkt auf das Ergebnis macht offensichtlich keinen Sinn.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

Hallo BlackJack,

Code: Alles auswählen

A = np.array([1,2,3,4,5])
Type: Int32, Size: (5, )

Code: Alles auswählen

y_inds = (A <= 0.5).nonzero()
Type: tuple, Size: 1 --> Klickt man in den Value steht da Size (0,)

Code: Alles auswählen

y_ind = np.amax(y_inds)
Das provoziert bei mir den Value Error "zero-size to reduction operation maximum which has no identity", da man auf ein Array der Größe 0 scheinbar keinen Max-Befehl anwenden darf.

Code: Alles auswählen

 Ein `max()` direkt auf das Ergebnis macht offensichtlich keinen Sinn.
Warum ist das sinnlos, bis auf diesen Fall funktioniert die Methode ... welche andere Vorgehensweise ist hier sinnvoll?

Viele Grüße
Inco
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@incoggnito: was soll das Maximum einer leeren Menge sein? Es ist mathematisch nicht definiert, sodass numpy auch kein Ergebnis liefern kann. Und das Maximum dieses Tuples das Du da versuchst auszurechnen, ist immer noch ein Fehler. Schau doch nochmal in die Dokumentation, was nonzero als Ergebnis liefert.
incoggnito
User
Beiträge: 53
Registriert: Donnerstag 27. April 2017, 09:28

ok, so scheint es nun zu funktionieren ... hab ich es nun richtig verstanden? :mrgreen:

Code: Alles auswählen

A = np.array([1,2,3,4,5])
y_inds = np.argwhere(A <= 0.5)
if y_inds.size:
    y_ind = np.amax(y_inds)
Antworten