Seite 1 von 1

auf leeren array testen

Verfasst: Mittwoch 1. Juli 2009, 15:53
von feldmaus
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

Verfasst: Mittwoch 1. Juli 2009, 16:09
von Leonidas
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.

Verfasst: Mittwoch 1. Juli 2009, 16:11
von cofi

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()

Verfasst: Mittwoch 1. Juli 2009, 16:17
von Leonidas
Wow, da habe ich ja einen tollen Grenzfall ausgesucht. :oops: Immerhin kommt dort dann eine sinnvolle Fehlermeldung.

Verfasst: Mittwoch 1. Juli 2009, 16:19
von feldmaus
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

Verfasst: Mittwoch 1. Juli 2009, 16:25
von feldmaus
So jetzt habe ich es, glaube ich,

Code: Alles auswählen

np.any([np.any(p) for p in liste])
Grüße Markus

Verfasst: Mittwoch 1. Juli 2009, 16:28
von Leonidas
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.

Verfasst: Mittwoch 1. Juli 2009, 18:20
von CM
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

Verfasst: Donnerstag 16. Juli 2009, 06:35
von str1442
@feldmann_markus: Der Test mit "is" kann auch gar nicht funktionieren, siehe in der [wiki]FAQ[/wiki]