Wie kann man zuverlässig feststellen, ob ein Objekt einen Numpy-Typ hat?
Mir ist klar, dass diese Frage gegen die Philosophie der Ententypisierung verstößt, aber es soll sichergestellt werden, dass eine Funktion (die scipy und numpy verwendet) niemals einen numpy-Typ zurückgibt, es sei denn, sie wird mit einem numpy-Typ aufgerufen. Dies ergibt sich aus der Lösung einer anderen Frage, aber ich denke, das allgemeine Problem, festzustellen, ob ein Objekt einen Numpy-Typ hat, ist weit genug von dieser ursprünglichen Frage entfernt, dass sie getrennt werden sollten.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
quelle
quelle
Antworten:
Verwenden Sie die integrierte
type
Funktion, um den Typ abzurufen. Anschließend können Sie mithilfe der__module__
Eigenschaft herausfinden, wo er definiert wurde:quelle
Die Lösung, die ich mir ausgedacht habe, ist:
Doch es ist nicht 100% klar , dass alle numpy Typen garantiert werden entweder
np.ndarray
odernp.generic
, und dies ist wahrscheinlich nicht Version robust.quelle
dir(numpy)
nach Typen und eingebauten Funktionen (und Klassen, aber ich glaube nicht, dass es welche gibt) filtern und damit ein Tupelisinstance
gegen generieren , das robust wäre. (Ich glaube, Sie können eingebaute Funktionen an isinstance übergeben, ob sie tatsächlich Typkonstruktoren sind oder nicht, aber SieAlte Frage, aber ich habe eine endgültige Antwort mit einem Beispiel gefunden. Es kann nicht schaden, Fragen frisch zu halten, da ich das gleiche Problem hatte und keine klare Antwort fand. Der Schlüssel besteht darin, sicherzustellen, dass Sie
numpy
importiert haben, und dann denisinstance
Bool auszuführen . Dies mag zwar einfach erscheinen, aber wenn Sie einige Berechnungen über verschiedene Datentypen hinweg durchführen, kann diese kleine Überprüfung als schneller Test dienen, bevor Sie eine numpy-vektorisierte Operation starten.quelle
Das hängt eigentlich davon ab, wonach Sie suchen.
ndarray
,isinstance(..., np.ndarray)
ist a wahrscheinlich die einfachste. Stellen Sie sicher, dass Sie numpy nicht im Hintergrund neu laden, da das Modul möglicherweise anders ist. Andernfalls sollten Sie in Ordnung sein.MaskedArrays
,matrix
,recarray
Sind alle Unterklassen vonndarray
, so dass Sie sollten eingestellt werden.shape
und eindtype
Attribut hat. Sie können esdtype
mit den grundlegenden dtypes vergleichen, deren Liste Sie finden könnennp.core.numerictypes.genericTypeRank
. Beachten Sie, dass die Elemente dieser Liste Zeichenfolgen sind, sodass Sietested.dtype is np.dtype(an_element_of_the_list)
...quelle
numpy
Typ" suchen und definieren können, was dieses etwas ist, ist dies besser als die anderen Antworten. Und in den meisten Fällen, Sie sollten etwas Bestimmtes suchen , die Sie definieren können.Verwenden Sie die integrierte
type
Funktion, um den Typ abzurufen . Mit demin
Operator können Sie testen, ob der Typ ein Numpy-Typ ist, indem Sie überprüfen, ob er die Zeichenfolge enthältnumpy
.(Dieses Beispiel wurde übrigens in IPython ausgeführt . Sehr praktisch für die interaktive Verwendung und schnelle Tests.)
quelle
Beachten Sie, dass dies
type(numpy.ndarray)
eintype
Selbst ist und achten Sie auf boolesche und skalare Typen. Seien Sie nicht zu entmutigt, wenn es nicht intuitiv oder einfach ist, es ist zunächst ein Schmerz.Siehe auch: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Spaß mit Booleschen:
Weitere Informationen zu Skalartypen finden Sie unter: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
quelle