Seite 1 von 1

Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 11:16
von incoggnito
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

Re: Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 12:37
von Sirius3
@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.

Re: Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 12:58
von incoggnito
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:

Re: Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 14:06
von 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. :-)

Re: Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 14:16
von incoggnito
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

Re: Problem mit leerem Array

Verfasst: Freitag 28. April 2017, 14:42
von 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.

Re: Problem mit leerem Array

Verfasst: Dienstag 2. Mai 2017, 06:46
von incoggnito
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

Re: Problem mit leerem Array

Verfasst: Dienstag 2. Mai 2017, 07:50
von Sirius3
@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.

Re: Problem mit leerem Array

Verfasst: Dienstag 2. Mai 2017, 09:45
von incoggnito
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)