Wie kann ich überprüfen, ob ein Numpy-Array leer ist oder nicht?

169

Wie kann ich überprüfen, ob ein Numpy-Array leer ist oder nicht?

Ich habe den folgenden Code verwendet, aber dies schlägt fehl, wenn das Array eine Null enthält.

if not self.Definition.all():

Ist das die Lösung?

if self.Definition == array( [] ):
Kicsi Mano
quelle
6
len(array( [] ))ist 0. len(array( [0] )ist 1.
Steven Rumbalski
3
Möchten Sie ein Array mit der Länge Null, ein Array mit allen Nullen oder beides testen? Was ist Ihre Definition von "leer"?
John Lyon
12
@StevenRumbalski: Aber len(array([[]])ist auch 1!
Strpeter
len()gibt die Anzahl der Dimensionen in der ersten Achse an. Ein Array kann jedoch auf der ersten Achse eine Dimension ungleich Null haben, aber immer noch leer sein, wenn es auf einer anderen Achse eine Dimension auf Null hat. sizeist besser, da es das Produkt aller Achsen ist.
Asmeurer

Antworten:

303

Sie können sich das .sizeAttribut jederzeit ansehen . Es ist als Ganzzahl definiert und ist null ( 0), wenn das Array keine Elemente enthält:

import numpy as np
a = np.array([])

if a.size == 0:
    # Do something when `a` is empty
JoshAdel
quelle
4
Dies ist großartig für Numpy, aber es ist bedauerlich, dass es für Listen als unpythonisch angesehen wird. Schauen Sie sich die Diskussion für Listen an: stackoverflow.com/questions/53513/… Es wäre schön, dasselbe Muster für numpy Arrays und Listen zu verwenden.
Eric
NumPy-Code funktioniert im Allgemeinen nicht richtig auf Listen oder umgekehrt. Sie müssen Code anders schreiben, wenn Sie Listen oder NumPy-Arrays verwenden.
Asmeurer
22

http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2

Das Hauptobjekt von NumPy ist das homogene mehrdimensionale Array. In Numpy werden Dimensionen als Achsen bezeichnet. Die Anzahl der Achsen ist Rang. Numpys Array-Klasse heißt ndarray. Es ist auch durch das Alias-Array bekannt. Die wichtigeren Attribute eines ndarray-Objekts sind:

ndarray.ndim
die Anzahl der Achsen (Dimensionen) des Arrays. In der Python-Welt wird die Anzahl der Dimensionen als Rang bezeichnet.

ndarray.shape
die Abmessungen des Arrays. Dies ist ein Tupel von Ganzzahlen, die die Größe des Arrays in jeder Dimension angeben. Für eine Matrix mit n Zeilen und m Spalten ist die Form (n, m). Die Länge des Formtupels ist daher der Rang oder die Anzahl der Dimensionen ndim.

ndarray.size
die Gesamtzahl der Elemente des Arrays. Dies entspricht dem Produkt der Formelemente.

Oberst Panik
quelle
10

Eine Einschränkung. Beachten Sie, dass np.array (None) .size 1 zurückgibt! Dies liegt daran , a.size entspricht np.prod (a.shape), np.array (None) .shape ist (), und ein leeres Produkt ist 1.

>>> import numpy as np
>>> np.array(None).size
1
>>> np.array(None).shape
()
>>> np.prod(())
1.0

Daher verwende ich Folgendes, um zu testen, ob ein Numpy-Array Elemente enthält:

>>> def elements(array):
    ...     return array.ndim and array.size

>>> elements(np.array(None))
0
>>> elements(np.array([]))
0
>>> elements(np.zeros((2,3,4)))
24
user10178557
quelle
7
Ein Array, das das NoneObjekt enthält, ist kein leeres Array. Weitere Informationen finden Sie in den Antworten hier
DrBwts
1
@ DrBwts, die für diese Antwort nicht relevant sind.
Vidstige
@DrBwts Sein Array enthält das NoneObjekt nicht. Schau dir seine Form an.
Navin
Arrays mit Form ()sind skalare Arrays, die ein Element (den Skalar) enthalten. In diesem Beispiel ist der Skalar None( Nonehat keine besondere Bedeutung, dies ist nur ein Objektarray). Es hängt davon ab, was Sie tun, aber Sie möchten höchstwahrscheinlich skalare Arrays als nicht leer betrachten.
Asmeurer
-1

Warum sollten wir überprüfen wollen, ob ein Array vorhanden ist empty? Arrays wachsen oder schrumpfen nicht wie Listen. Das Beginnen mit einem 'leeren' Array und das Wachsen mit np.appendist ein häufiger Anfängerfehler.

Verwenden einer Liste in if alist:Scharnieren von ihrem Booleschen Wert:

In [102]: bool([])                                                                       
Out[102]: False
In [103]: bool([1])                                                                      
Out[103]: True

Der Versuch, dasselbe mit einem Array zu tun, führt jedoch (in Version 1.18) zu:

In [104]: bool(np.array([]))                                                             
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value 
   of an empty array is ambiguous. Returning False, but in 
   future this will result in an error. Use `array.size > 0` to 
   check that an array is not empty.
  #!/usr/bin/python3
Out[104]: False

In [105]: bool(np.array([1]))                                                            
Out[105]: True

und bool(np.array([1,2])erzeugt den berüchtigten Mehrdeutigkeitsfehler.

hpaulj
quelle