2011-12-12 8 views
6

La funciónNumPy C-API: convertir el tipo de objeto a tipo de número

PyObject* PyArray_TypeObjectFromType(int); 

convierte el número de tipo para un NumPy tipo escalar (NPY_BOOL, NPY_BYTE, ...) para el objeto de texto correspondiente.

¿Cómo se hace la conversión opuesta, del tipo objeto para un tipo escalar NumPy al número de tipo correspondiente?

Editar: El siguiente código se basa en la respuesta de kwatford. Acepta tanto objetos tipo como int y numpy.int16, y cadenas como "int", u "int" e "int16".

int numpyScalarTypeNumber(PyObject* obj) 
{ 
    PyArray_Descr* dtype; 
    if(!PyArray_DescrConverter(obj, &dtype)) return NPY_NOTYPE; 
    int typeNum = dtype->type_num; 
    Py_DECREF(dtype); 
    return typeNum; 
} 

Respuesta

4

Si usted puede conseguir PyArray_Descr estructuras en lugar de PyArray_TypeObject s, simplemente puede mirar en el campo type_num. Las estructuras descritas se pueden adquirir a través del número de tipo usando PyArray_DescrFromType. Si mira ese enlace, también hay algunas funciones más para convertir varias cosas en estructuras descritas. Probablemente sean más útiles en general que los objetos tipo, y también contienen referencias a sus tipos.

+0

Eso no responde mi pregunta. Solo tengo el objeto tipo para trabajar. Estoy escribiendo un módulo de extensión de Python donde una de las funciones tiene una interfaz de Python que toma un objeto tipo para un tipo escalar. – user763305

+3

Entonces probablemente esté buscando [PyArray_DescrConverter] (http://docs.scipy.org/doc/numpy/reference/c-api.array.html#PyArray_DescrConverter) que debe tomar un tipo o nombre de un tipo (o otras cosas que puedes dar a 'numpy.dtype') y obtener el descr para él. A partir de eso, puede obtener el número de tipo, tipo, tipo, objeto o cualquier otra cosa que desee. – kwatford

+0

+1: Eso resolvió el problema. Ver edición en mi pregunta anterior. – user763305

Cuestiones relacionadas