Jak mogę sprawdzić, czy tablica numpy jest pusta, czy nie?

169

Jak mogę sprawdzić, czy tablica numpy jest pusta, czy nie?

Użyłem następującego kodu, ale kończy się to niepowodzeniem, jeśli tablica zawiera zero.

if not self.Definition.all():

Czy to jest rozwiązanie?

if self.Definition == array( [] ):
Kicsi Mano
źródło
6
len(array( [] ))wynosi 0. len(array( [0] )jest 1.
Steven Rumbalski
3
chcesz przetestować tablicę o zerowej długości, tablicę zawierającą wszystkie zera, czy jedno i drugie? Jaka jest Twoja definicja „pustego”?
John Lyon
12
@StevenRumbalski: Ale len(array([[]])jest też 1!
strpeter
len()podaje liczbę wymiarów na pierwszej osi. Ale tablica może mieć niezerowy wymiar na pierwszej osi, ale nadal być pusta, jeśli ma zerowy wymiar na innej osi. sizejest lepsze, ponieważ jest iloczynem wszystkich osi.
asmeurer

Odpowiedzi:

303

Zawsze możesz rzucić okiem na .sizeatrybut. Jest definiowany jako liczba całkowita i wynosi zero ( 0), gdy w tablicy nie ma żadnych elementów:

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

if a.size == 0:
    # Do something when `a` is empty
JoshAdel
źródło
4
Jest to świetne rozwiązanie dla numpy, ale niefortunne, że jest uważane za nieprzyzwoite dla list. Sprawdź dyskusję na temat list: stackoverflow.com/questions/53513/… Byłoby miło użyć tego samego wzorca dla tablic numpy i list.
eric
Ogólnie kod NumPy nie działa poprawnie na listach lub odwrotnie. Musisz napisać kod w inny sposób, jeśli używasz list i tablic NumPy.
asmeurer
22

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

Głównym obiektem NumPy jest jednorodna wielowymiarowa tablica. W Numpy wymiary nazywane są osiami. Liczba osi to ranga. Klasa tablicowa Numpy nazywa się ndarray. Jest również znany z tablicy aliasów. Ważniejsze atrybuty obiektu ndarray to:

ndarray.ndim
liczba osi (wymiarów) tablicy. W świecie Pythona liczba wymiarów jest określana jako ranga.

ndarray.shape
wymiary tablicy. Jest to krotka liczb całkowitych wskazująca rozmiar tablicy w każdym wymiarze. W przypadku macierzy z n wierszami im kolumnami kształt będzie (n, m). Długość krotki kształtu jest więc rangą lub liczbą wymiarów ndim.

ndarray.size
całkowita liczba elementów tablicy. Jest to równe iloczynowi elementów kształtu.

Colonel Panic
źródło
10

Jedno zastrzeżenie. Zauważ, że np.array (None) .size zwraca 1! Dzieje się tak, ponieważ a.size jest odpowiednikiem np.prod (a.shape), np.array (None) .shape to (), a pusty produkt to 1.

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

Dlatego używam poniższego, aby sprawdzić, czy tablica numpy zawiera elementy:

>>> 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
źródło
8
Tablica zawierająca Noneobiekt nie jest pustą tablicą, zobacz odpowiedzi tutaj, aby uzyskać więcej informacji
DrBwts
1
@DrBwts to nie dotyczy tej odpowiedzi.
vidstige
@DrBwts Jego tablica nie zawiera Noneobiektu. Spójrz na jego kształt.
Navin
Tablice z kształtem ()to tablice skalarne, które zawierają element (skalar). W tym przykładzie wartość skalarna to None( Nonenie ma specjalnego znaczenia, jest to tylko tablica obiektów). Zależy to od tego, co robisz, ale najprawdopodobniej chcesz wziąć pod uwagę tablice skalarne jako niepuste.
asmeurer
-1

Dlaczego mielibyśmy chcieć sprawdzić, czy tablica jest empty? Tablice nie rosną ani nie kurczą się w taki sam sposób, jak listy. Rozpoczynanie od „pustej” tablicy i powiększanie wraz z np.appendjest częstym początkowym błędem.

Używanie listy w if alist:zawiasach na jej wartości logicznej:

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

Ale próba zrobienia tego samego z tablicą daje (w wersji 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

i bool(np.array([1,2])powoduje niesławny błąd niejednoznaczności.

hpaulj
źródło