promedio multiplicacion matrices matplot libreria instalar graficos graficar elementos crear coordenadas arreglos array agregar python numpy duck-typing dynamic-typing

multiplicacion - shape en python



¿Cómo identificar los tipos numpy en python? (5)

¿Cómo puede uno determinar de manera confiable si un objeto tiene un tipo numpy?

Me doy cuenta de que esta pregunta va en contra de la filosofía del tipado de pato, pero la idea es asegurarme 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.


Eso en realidad depende de lo que estás buscando.

  • Si desea probar si una secuencia es en realidad una ndarray , una isinstance(..., np.ndarray) es probablemente la más fácil. Asegúrese de no volver a cargar numpy en el fondo ya que el módulo puede ser diferente, pero de lo contrario, debería estar bien. MaskedArrays , matrix , recarray son todas las subclases de ndarray , por lo que debe establecerse.
  • Si desea probar si un escalar es un escalar numpy, las cosas se vuelven un poco más complicadas. Puede verificar si tiene una shape y un atributo de tipo. Puede comparar su dtype con los dtypes básicos, cuya lista puede encontrar en np.core.numerictypes.genericTypeRank . Tenga en cuenta que los elementos de esta lista son cadenas, por lo que tendría que hacer un tested.dtype is np.dtype(an_element_of_the_list) ...

La solución que he encontrado es:

isinstance(y, (np.ndarray, np.generic) )

Sin embargo, no está 100% claro que se garantice que todos los tipos np.ndarray sean np.ndarray o np.generic , y probablemente esta no sea una versión robusta.


Para obtener el tipo, use la función de type incorporado. Con el operador in , puede probar si el tipo es de tipo numpy verificando si contiene el numpy cadena;

In [1]: import numpy as np In [2]: a = np.array([1, 2, 3]) In [3]: type(a) Out[3]: <type ''numpy.ndarray''> In [4]: ''numpy'' in str(type(a)) Out[4]: True

(Por cierto, este ejemplo se ejecutó en IPython . Muy útil para uso interactivo y pruebas rápidas).


Una vieja pregunta pero se me ocurrió una respuesta definitiva con un ejemplo. No puedo hacer nada para mantener las preguntas frescas ya que tuve este mismo problema y no encontré una respuesta clara. La clave es asegurarse de que haya importado numpy , y luego ejecutar el bool de isinstance . Si bien esto puede parecer simple, si está haciendo algunos cálculos en diferentes tipos de datos, esta pequeña comprobación puede servir como una prueba rápida antes de comenzar una operación numerada vectorizada.

################## # important part! ################## import numpy as np #################### # toy array for demo #################### arr = np.asarray(range(1,100,2)) ######################## # The instance check ######################## isinstance(arr,np.ndarray)


Use la función de type incorporado para obtener el tipo, luego puede usar la propiedad __module__ para averiguar dónde se ha definido:

>>> import numpy as np a = np.array([1, 2, 3]) >>> type(a) <type ''numpy.ndarray''> >>> type(a).__module__ ''numpy'' >>> type(a).__module__ == np.__name__ True