2012-12-01 4 views
12

Ho un tipo di dati float personalizzato che emula i float a 128 bit utilizzando due float a 64 bit (la doppia doppia classe dd_real da QD library). Da C++ voglio esportare un narray in python. So già come farlo per i float a 64 bit, ma per i doppioni raddoppia ho bisogno di specificare il mio dtype personalizzato. Come farlo?Come definire dtypes numpy float-type (C-API)

Nota: numpy ha il proprio float a 128 bit (np.float128) sfortunatamente questa mappa è long double in C/C++ che è semplicemente un galleggiante a 80 bit memorizzato in 128 bit (su tutte le mie piattaforme).

In effetti, si dovrebbe essere in grado di farlo esattamente nello stesso modo in cui numpy esporta np.float128 (non so come è fatto), con la sola differenza che usa sul lato C++ invece di long double.

Se questo aiuta, ho già esportato il tipo C++ dd_real in python usando boost::python forse questo può essere riutilizzato in qualche modo.


Finora sono stato in grado di ricerca la seguente

  1. La documentazione NumPy per dtypes si riferisce a C-API per come esportare dtypes personalizzati, ma quel documento in qualche modo spiega solo le dtypes esistenti non come creane di nuovi.

  2. Quando lo stackoverflow browsing ho trovato l'esempio this, ma mi chiedo se per dd_real questo potrebbe essere più semplice. Inoltre, non vedo dove viene effettivamente generato il dtype. Forse solo in python __ init__ tramite np.typeDict['quaternion'] = np.dtype(quaternion). Come usare quel dtype in C++ quando voglio generare un ndarray?

risposta

4

Il repository si è collegato al,

https://github.com/numpy/numpy-dtypes 

contiene probabilmente il più semplice esempi possibili su come aggiungere nuove DTYPE a Numpy. Non sono a conoscenza di un modo più semplice. Notare le chiamate a register_cast_function e REGISTER_UFUNC in questi file: queste indicano a Numpy come le operazioni come la moltiplicazione e la trasmissione debbano essere gestite a livello di elemento per elemento.

Tuttavia, se ciò che si vuole realmente fare è quello di esportare solo i dati, si può solo esportare come una matrice di doppio, o forse bundling due doppie a un unico tipo di dati

np.dtype([('a', double), ('b', double)]) 

Quindi, è 'D bisogno di scrivere funzioni separate per fare operazioni su questi array (come arr1 * arr2 non farà quello che vuoi qui). Un modo possibile per andare oltre e rendere anche arr1 * arr2 funzionare sarebbe quello di sottoclasse np.ndarray il tipo di dati, ignorando le operazioni __mul__ ecc.

+0

Qual è l'equivalente di 'np.dtype (...)' in C++? –

+1

Costruisci la lista con le tuple e chiama 'PyArray_DescrConverter'. Ma probabilmente è più facile esportare una serie di doppi e farlo sul lato Python. –

+2

Beh, ho bisogno di costruire un narray da C++ e per questo ho bisogno del dtype in C++. –