Chciałbym sprawdzić, czy zmienna to None lub numpy.array. Zaimplementowałem check_a
funkcję, aby to zrobić.
def check_a(a):
if not a:
print "please initialize a"
a = None
check_a(a)
a = np.array([1,2])
check_a(a)
Ale ten kod wywołuje ValueError. Jaka jest prosta droga?
ValueError Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
6 check_a(a)
7 a = np.array([1,2])
----> 8 check_a(a)
<ipython-input-41-0201c81c185e> in check_a(a)
1 def check_a(a):
----> 2 if not a:
3 print "please initialize a"
4
5 a = None
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
ValueError
jedno z najczęściejnumpy
zadawanych pytań. Oznacza to, żenot a
tworzy tablicę logiczną zawierającą (w tym przypadku) 2 wartości. Ta tablica logiczna nie może być używana jakoif
warunek!is None
Alternatywą jest dobrze wiedzieć, ale należy również zrozumieć ten błąd.not
, więc błąd faktycznie występuje, gdynot
próbuje traktować tablicę jako pojedynczą wartość logiczną i okazuje się, że nie może. Gdyby tak było~a
, wykorzystałoby to przeciążenie NumPy i zakończyło się niepowodzeniem przyif
próbie użycia zanegowanej tablicy jako pojedynczej wartości logicznej.Odpowiedzi:
Korzystanie
not a
aby sprawdzić, czya
toNone
zakłada, że inne możliwe wartościa
mają wartość prawdyTrue
. Jednak większość tablic NumPy w ogóle nie ma wartości prawdziwości inot
nie można ich do nich zastosować.Jeśli chcesz sprawdzić, czy obiekt jest
None
, najbardziej ogólnym i niezawodnym sposobem jest dosłowne użycieis
sprawdzeniaNone
:Nie zależy to od obiektów mających wartość prawdy, więc działa z tablicami NumPy.
Zauważ, że test musi być
is
, nie==
.is
jest testem tożsamości obiektu.==
jest cokolwiek mówią argumenty, a tablice NumPy mówią, że jest to transmitowane elementowe porównanie równości, tworząc tablicę boolowską:Z drugiej strony, jeśli chcesz sprawdzić, czy obiekt jest tablicą NumPy, możesz przetestować jego typ:
Możesz także użyć
isinstance
, który zwróci równieżTrue
dla podklas tego typu (jeśli tego chcesz). Biorąc pod uwagę, jak straszne i niekompatybilnenp.matrix
jest to, możesz tego nie chcieć:źródło
Jeśli próbujesz zrobić coś bardzo podobnego:
a is not None
pojawia się ten sam problem. Oznacza to, że Numpy narzeka, że należy użyća.any
luba.all
.Sposób obejścia problemu:
Niezbyt ładna, ale spełnia swoje zadanie.
źródło
Możesz zobaczyć, czy obiekt ma kształt, czy nie
źródło