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
, unaisinstance(..., 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 dendarray
, 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 sudtype
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)
...
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