auf leeren array testen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hallo Alle,

ich sitze schon seit einiger Zeit mit Kopfschmerzen an dieser Aufgabe und kriege es nicht hin. Gefunden habe ich nichts brauchbares. Ich will einen numpy.array auf leer testen, wenn der nicht leer ist , dann werden weitere Schritte ausgeführt.

Code: Alles auswählen

import numpy as np
liste=[np.array([]),np.array([]),np.array([])]
Ich habe schon mehrere Sachen mit numpy probiert. Ach so vergessen. Es sollte eine schnelle Methode sein, da meine <liste> ab und zu viele Werte enthält und manchmal keine.

Hier ein Beispiel wie es NICHT funktioniert,

Code: Alles auswählen

[(p is np.array([])) for p in liste]
ODER

Code: Alles auswählen

[np.logical_and(p,True) for p in liste]
Grüße Markus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Numpy Arrays haben einfach einen Wahrheitswert:

Code: Alles auswählen

import numpy

if numpy.array([1]):
    print "Non-empty"

if not numpy.array([]):
    print "empty"
Kann man mit ``bool()`` auch recht einfach rausfinden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

In [10]: import numpy

In [11]: a = numpy.array([])

In [12]: a.any()
Out[12]: False

In [13]: a = numpy.array([1,2])

In [14]: a.any()
Out[14]: True
@Leonidas `bool` klappt nicht immer:

Code: Alles auswählen

In [15]: bool(a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/var/repos/git/<ipython console> in <module>()

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wow, da habe ich ja einen tollen Grenzfall ausgesucht. :oops: Immerhin kommt dort dann eine sinnvolle Fehlermeldung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Danke Euch beiden, ich wollte nochmal drauf hinweisen, dass ich mehrere arrays in einer Liste habe. Eure Beispiele nutzen keine Listen.

Dann kommt nämlich noch die schöne Meldung ,
ValueError: setting an array element with a sequence.
dazu.

Der code sieht dann so aus:

Code: Alles auswählen

import numpy as np
liste=[np.array([]),np.array([]),np.array([1.2])]
np.any(liste)
Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

So jetzt habe ich es, glaube ich,

Code: Alles auswählen

np.any([np.any(p) for p in liste])
Grüße Markus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

feldmann_markus hat geschrieben:Danke Euch beiden, ich wollte nochmal drauf hinweisen, dass ich mehrere arrays in einer Liste habe. Eure Beispiele nutzen keine Listen.
Weil wir davon ausgehen dass die Adaptation auf eine Liste trivial ist.

Du brauchst dafür nichtmal ``numpy.any``, Pythons eingebautes ``any()`` reicht schon:

Code: Alles auswählen

any(p.any() for p in liste)
Hat auch den Vorteil, dass es beim ersten Eintrag der ``True`` ergibt abbricht, ohne dass die anderen Arrays geprüft werden müssen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Vorsicht! Der konkrete Anwendungsfall mag effizient sein, aber wahrscheinlich ist es besser ein 2D-ndarray zu nutzen - zumindest, wenn die Arrays mit (vielen) numerischen Werten gefüllt werden sollen. Im Zweifel: Testen.

HTH
Christian
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@feldmann_markus: Der Test mit "is" kann auch gar nicht funktionieren, siehe in der [wiki]FAQ[/wiki]
Antworten