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
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.
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.
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
@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:
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.ReturningFalse, but in
future this will result in an error.Use`array.size >0` to
check that an array isnot empty.#!/usr/bin/python3Out[104]:FalseIn[105]: bool(np.array([1]))Out[105]:True
i bool(np.array([1,2])powoduje niesławny błąd niejednoznaczności.
len(array( [] ))
wynosi 0.len(array( [0] )
jest 1.len(array([[]])
jest też 1!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.size
jest lepsze, ponieważ jest iloczynem wszystkich osi.Odpowiedzi:
Zawsze możesz rzucić okiem na
.size
atrybut. Jest definiowany jako liczba całkowita i wynosi zero (0
), gdy w tablicy nie ma żadnych elementów:źródło
http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2
źródło
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.
Dlatego używam poniższego, aby sprawdzić, czy tablica numpy zawiera elementy:
źródło
None
obiekt nie jest pustą tablicą, zobacz odpowiedzi tutaj, aby uzyskać więcej informacjiNone
obiektu. Spójrz na jego kształt.()
to tablice skalarne, które zawierają element (skalar). W tym przykładzie wartość skalarna toNone
(None
nie 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.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 znp.append
jest częstym początkowym błędem.Używanie listy w
if alist:
zawiasach na jej wartości logicznej:Ale próba zrobienia tego samego z tablicą daje (w wersji 1.18):
i
bool(np.array([1,2])
powoduje niesławny błąd niejednoznaczności.źródło