¿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
typefunció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.ndarrayonp.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 tuplaisinstancecontra, 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
numpyimportado y luego ejecutar elisinstancebool. 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,recarraySon todas las subclases dendarray, por lo que debe ser fijado.shapeundtypeatributo y un atributo. Puede compararlodtypecon 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
numpytipo" 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
typefunción incorporada . Con elinoperador, 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 untypesí 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