Jak można wiarygodnie określić, czy obiekt ma typ numpy?
Zdaję sobie sprawę, że to pytanie jest sprzeczne z filozofią pisania typu kaczego, ale chodzi o to, aby upewnić się, że funkcja (która używa scipy i numpy) nigdy nie zwraca typu numpy, chyba że zostanie wywołana typem numpy. To pojawia się w rozwiązaniu innego pytania, ale myślę, że ogólny problem określenia, czy obiekt ma typ numpy, jest na tyle daleki od pierwotnego pytania, że należy je oddzielić.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
źródło
źródło
Odpowiedzi:
Użyj
type
funkcji wbudowanej, aby uzyskać typ, a następnie możesz użyć__module__
właściwości, aby dowiedzieć się, gdzie został zdefiniowany:źródło
Rozwiązanie, które wymyśliłem, to:
Jednak to nie jest w 100% jasne, że wszystkie NumPy typy są gwarantowane być albo
np.ndarray
albonp.generic
, i to chyba nie jest wersja wytrzymałe.źródło
dir(numpy)
typy i funkcje wbudowane (i klasy, ale nie sądzę, że ma jakieś) i użyć tego do wygenerowania krotkiisinstance
przeciwko, co byłoby solidne. (Wierzę, że możesz przekazać wbudowane funkcje do instancji, niezależnie od tego, czy są one faktycznie konstruktorami typu, czy nie, ale musisz to sprawdzić.)Stare pytanie, ale ostateczną odpowiedź wymyśliłem na przykładzie. Nie zaszkodzi zachować świeżość pytań, ponieważ miałem ten sam problem i nie znalazłem jasnej odpowiedzi. Najważniejsze jest, aby upewnić się, że
numpy
zaimportowałeś, a następnie uruchomićisinstance
bool. Chociaż może się to wydawać proste, jeśli wykonujesz obliczenia na różnych typach danych, to małe sprawdzenie może służyć jako szybki test przed rozpoczęciem jakiejś numpy wektoryzowanej operacji.źródło
To właściwie zależy od tego, czego szukasz.
ndarray
,isinstance(..., np.ndarray)
prawdopodobnie najłatwiejsza jest metoda a. Upewnij się, że nie ładujesz ponownie numpy w tle, ponieważ moduł może być inny, ale w przeciwnym razie powinno być OK.MaskedArrays
,matrix
,recarray
To wszystkie podklasyndarray
, tak powinno być ustawione.shape
adtype
atrybut. Możesz porównaćdtype
to z podstawowymi typami, których listę znajdziesz wnp.core.numerictypes.genericTypeRank
. Zwróć uwagę, że elementy tej listy to ciągi, więc musiałbyś wykonaćtested.dtype is np.dtype(an_element_of_the_list)
...źródło
numpy
typem” i możesz określić, czym to coś jest, to jest to lepsze niż inne odpowiedzi. W większości przypadków powinieneś szukać czegoś konkretnego, co możesz zdefiniować.Aby uzyskać typ, użyj
type
funkcji wbudowanej . Za pomocąin
operatora możesz sprawdzić, czy typ jest numpy, sprawdzając, czy zawiera ciągnumpy
;( Nawiasem mówiąc, ten przykład został uruchomiony w IPythonie . Bardzo przydatny do interaktywnego użytku i szybkich testów).
źródło
Zwróć uwagę, że
type(numpy.ndarray)
jesttype
sam w sobie i uważaj na typy logiczne i skalarne. Nie zniechęcaj się, jeśli nie jest to intuicyjne lub łatwe, na początku jest to ból.Zobacz też: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Zabawa z wartościami logicznymi:
Więcej zabawy z typami skalarnymi, patrz: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
źródło