2011-12-12 9 views
6

La funzioneNumPy C-API: convertire tipo di oggetto per digitare il numero

PyObject* PyArray_TypeObjectFromType(int); 

converte il numero del tipo per un NumPy tipo scalare (NPY_BOOL, NPY_BYTE, ...) all'oggetto tipo corrispondente.

Come si esegue la conversione opposta, dall'oggetto tipo per un tipo scalare NumPy al numero di tipo corrispondente?

Modifica: Il seguente codice è basato sulla risposta di kwatford. Accetta sia oggetti di tipo come int e numpy.int16, sia stringhe come "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; 
} 

risposta

4

Se è possibile ottenere PyArray_Descr le strutture piuttosto che PyArray_TypeObject s, si può semplicemente guardare il campo type_num. Le strutture descr possono essere acquisite tramite il numero di tipo usando PyArray_DescrFromType. Se guardi a quel link, ci sono anche alcune altre funzioni per convertire varie cose in strutture descr. Probabilmente sono più utili in generale degli oggetti di tipo e contengono anche riferimenti ai loro tipi.

+0

Questo non risponde alla mia domanda. Ho solo l'oggetto tipo con cui lavorare. Sto scrivendo un modulo di estensione Python in cui una delle funzioni ha un'interfaccia Python che accetta un oggetto di tipo per un tipo scalare. – user763305

+3

Quindi probabilmente stai cercando [PyArray_DescrConverter] (http://docs.scipy.org/doc/numpy/reference/c-api.array.html#PyArray_DescrConverter) che dovrebbe richiedere un tipo o un nome di un tipo (o altre cose che puoi dare a 'numpy.dtype') e ottieni il descr per esso. Da ciò puoi ottenere il numero del tipo, il tipo di tipo, il tipo di oggetto o qualsiasi altra cosa desideri. – kwatford

+0

+1: questo ha risolto il problema. Vedi modifica nella mia domanda sopra. – user763305

Problemi correlati