Come posso verificare se un array numpy è vuoto o no?


169

Come posso verificare se un array numpy è vuoto o no?

Ho usato il seguente codice, ma questo non riesce se l'array contiene uno zero.

if not self.Definition.all():

Questa è la soluzione?

if self.Definition == array( [] ):

6
len(array( [] ))è 0. len(array( [0] )è 1.
Steven Rumbalski il

3
vuoi testare un array di lunghezza zero, un array contenente tutti gli zeri o entrambi? Qual è la tua definizione di "vuoto"?
John Lyon,

12
@StevenRumbalski: Ma len(array([[]])è anche 1!
strpeter,

len()indica il numero di dimensioni nel primo asse. Ma un array può avere una dimensione diversa da zero nel primo asse ma essere comunque vuoto se ha una dimensione zero in un altro asse. sizeè migliore in quanto è il prodotto di tutti gli assi.
asmeurer il

Risposte:


303

Puoi sempre dare un'occhiata .sizeall'attributo. È definito come un numero intero ed è zero ( 0) quando non ci sono elementi nell'array:

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

if a.size == 0:
    # Do something when `a` is empty

4
Questo è ottimo per numpy, ma è sfortunato che sia considerato non pitonico per gli elenchi. Dai un'occhiata alla discussione per gli elenchi: stackoverflow.com/questions/53513/… Sarebbe bello usare lo stesso schema per gli array e gli elenchi intorpiditi.
eric,

Il codice NumPy in generale non funziona correttamente sugli elenchi o viceversa. È necessario scrivere il codice in modo diverso se si utilizzano elenchi rispetto a matrici NumPy.
asmeurer il

22

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

L'oggetto principale di NumPy è l'array multidimensionale omogeneo. In Numpy le dimensioni sono chiamate assi. Il numero di assi è rango. La classe di array di Numpy si chiama ndarray. È anche conosciuto dall'array alias. Gli attributi più importanti di un oggetto ndarray sono:

ndarray.ndim
il numero di assi (dimensioni) dell'array. Nel mondo Python, il numero di dimensioni viene definito rango.

ndarray.shape
le dimensioni dell'array. Questa è una tupla di numeri interi che indica la dimensione dell'array in ciascuna dimensione. Per una matrice con n righe e m colonne, la forma sarà (n, m). La lunghezza della tupla di forma è quindi il rango, o il numero di dimensioni, ndim.

ndarray.size
il numero totale di elementi dell'array. Questo è uguale al prodotto degli elementi di forma.


10

Un avvertimento, però. Nota che np.array (None) .size restituisce 1! Questo perché a.size equivale a np.prod (a.shape), np.array (None) .shape is () e un prodotto vuoto è 1.

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

Pertanto, utilizzo quanto segue per verificare se un array intorpidito ha elementi:

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

8
Un array contenente l' Noneoggetto non è un array vuoto, vedere le risposte qui per ulteriori dettagli
DrBwts

1
@DrBwts non è rilevante per questa risposta.
vidstige,

@DrBwts Il suo array non contiene l' Noneoggetto. Guarda la sua forma.
Navin

Gli array con forma ()sono array scalari, che contengono un elemento (lo scalare). In questo esempio, lo scalare è None( Nonenon ha alcun significato speciale, questo è solo un array di oggetti). Dipende da cosa stai facendo, ma molto probabilmente vorrai considerare le matrici scalari come non vuote.
asmeurer,

-1

Perché dovremmo verificare se un array è empty? Le matrici non crescono o si riducono come le liste. Iniziare con un array "vuoto" e crescere con np.appendè un frequente errore da principiante.

Utilizzando un elenco in if alist:cardini sul suo valore booleano:

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

Ma provare a fare lo stesso con un array produce (nella versione 1.18):

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

e bool(np.array([1,2])produce il famigerato errore di ambiguità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.