¿Cómo se puede determinar de manera confiable si un objeto tiene un tipo numérico?
Me doy cuenta de que esta pregunta va en contra de la filosofía de la escritura de pato, pero la idea es asegurarse de que una función (que usa scipy y numpy) nunca devuelva un tipo numpy a menos que se llame con un tipo numpy. Esto surge en la solución a otra pregunta, pero creo que el problema general de determinar si un objeto tiene un tipo numpy está lo suficientemente lejos de la pregunta original como para separarlos.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
fuente
fuente
Respuestas:
Use la
type
función incorporada para obtener el tipo, luego puede usar la__module__
propiedad para averiguar dónde se definió:fuente
La solución que se me ocurrió es:
Sin embargo, no está 100% claro si se garantiza que todos los tipos de numpy sean
np.ndarray
onp.generic
, y esta probablemente no sea una versión sólida.fuente
dir(numpy)
por tipos y funciones integradas (y clases, pero no creo que tenga ninguna) y usar eso para generar una tuplaisinstance
contra, lo que sería robusto. (Creo que se puede pasar incorporado funciones de isinstance si están realmente constructores de tipo o no, pero que tendría que comprobar que.)Pregunta antigua, pero se me ocurrió una respuesta definitiva con un ejemplo. No está de más mantener las preguntas frescas ya que tuve el mismo problema y no encontré una respuesta clara. La clave es asegurarse de haber
numpy
importado y luego ejecutar elisinstance
bool. Si bien esto puede parecer simple, si está haciendo algunos cálculos en diferentes tipos de datos, esta pequeña verificación puede servir como una prueba rápida antes de comenzar alguna operación vectorizada numpy.fuente
De hecho, eso depende de lo que estés buscando.
ndarray
,isinstance(..., np.ndarray)
probablemente a sea la más fácil. Asegúrese de no volver a cargar numpy en segundo plano, ya que el módulo puede ser diferente, pero de lo contrario, debería estar bien.MaskedArrays
,matrix
,recarray
Son todas las subclases dendarray
, por lo que debe ser fijado.shape
undtype
atributo y un atributo. Puede compararlodtype
con los dtypes básicos, cuya lista puede encontrar ennp.core.numerictypes.genericTypeRank
. Tenga en cuenta que los elementos de esta lista son cadenas, por lo que tendría que hacer untested.dtype is np.dtype(an_element_of_the_list)
...fuente
numpy
tipo" y puede definir qué es ese algo, esto es mejor que las otras respuestas. Y en la mayoría de los casos, debería buscar algo específico que pueda definir.Para obtener el tipo, use la
type
función incorporada . Con elin
operador, puede probar si el tipo es un tipo numérico comprobando si contiene la cadenanumpy
;(Este ejemplo se ejecutó en IPython , por cierto. Muy útil para uso interactivo y pruebas rápidas).
fuente
Tenga en cuenta que
type(numpy.ndarray)
es untype
sí mismo y tenga cuidado con los tipos booleanos y escalares. No se desanime demasiado si no es intuitivo o fácil, es un dolor al principio.Véase también: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Diversión con booleanos:
Más diversión con tipos escalares, consulte: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
fuente