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:
Sollte ich besser nur numpy importieren?
Hab mir eben die Rückgabewerte angesehen ... verstehe die where funktion nicht ... gibt es Alternativen

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,
Type: Int32, Size: (5, )
Type: tuple, Size: 1 --> Klickt man in den Value steht da Size (0,)
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?
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)