+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Numpy Array e PyArrayObject

  1. #1
    lucagalbu non è in linea Scolaretto
    Ciao!
    Ho un dubbio sull'utilizzo di PyArrayobject per interfacciare numpy con il C.
    Io passo un numpy array ad una funzione C e lo memorizzo in un puntatore
    PyArrayObject* ptr;
    
    Il numpy array è un array monodimensionale a due celle di tipo double. Per accedere ai suoi dati usando ptr dovrei scrivere
    <numpy array cella k>=ptr->data+k*ptr->stride[0];
    
    Ora, io ho notato che in realtà posso anche accedervi così
    double *ptr2=((double*)(ptr->data));
    cout << ptr2[0] << "  " << ptr[1] << endl;
    
    È un caso che così funzioni, o è un metodo che si può usare?
    ℹ️ Leggi di più su lucagalbu ...

  2. #2
    L'avatar di Master85
    Master85 non è in linea Moderatore Globale Ultimo blog: Eclipse: Un IDE per PHP e Python
    Ciao Lucagalbu,

    premetto di non aver mai utilizzato le librerie numpy col C, in ogni caso dando uno sguardo alla documentazione ufficiale (Python Types and C-Structures), la struttura dati di PyArrayObject che viene fuori è la seguente:

    typedef struct PyArrayObject {
        PyObject_HEAD
        char *data;
        int nd;
        npy_intp *dimensions;
        npy_intp *strides;
        PyObject *base;
        PyArray_Descr *descr;
        int flags;
        PyObject *weakreflist;
    } PyArrayObject;
    
    Ciò che vai ad usare nel tuo codice sono i valori memorizzati in data e strides, che rispettivamente individuano il puntatore al primo elemento dell'array, e un array di interi che contiene il numero dei byte da saltare per raggiungere il successivo elemento dell'array per ogni dimensione.

    Le tue due scritture non sono affatto equivalenti.

    Nel 1° caso:

    double *ptr2 = (double *) (ptr->data + k*ptr->stride[0]);
    
    Qui, secondo l'aritmetica dei puntatori, ti stai spostando al k-esimo elemento dell'array (dal momento che data è un puntatore a char e stride indica il numero di byte da saltare per passare all'elemento successivo).

    Nel 2° caso:

    double *ptr2 = (double *) ptr->data;
    
    Qui sei fermo al primo elemento puntato da data.

    Il primo ed il secondo caso possono coincidere solo se k (vedi 1° caso) è uguale a zero.
    Ultima modifica di Master85; 10-08-2012 16:55 

  3. #3
    lucagalbu non è in linea Scolaretto
    Grazie per la risposta.
    La cosa strana è che il codice funziona perfettamente anche con il secondo metodo. Comunque, per essere sicuro ho riscritto tutto usando l'aritmetica corretta.
    ℹ️ Leggi di più su lucagalbu ...

  4. #4
    L'avatar di Master85
    Master85 non è in linea Moderatore Globale Ultimo blog: Eclipse: Un IDE per PHP e Python
    Quote Originariamente inviato da lucagalbu Visualizza il messaggio
    ...
    La cosa strana è che il codice funziona perfettamente anche con il secondo metodo
    ...
    Se postassi parte del codice interessato potremmo investigare meglio l'argomento.

  5. #5
    lucagalbu non è in linea Scolaretto
    Ciao. Scusami se non ho più risposto, ma avevo accantonato questo esame per dedicarmi ad altri e così non ho più letto il forum. Ora ho ripreso in mano il codice e appena risolvo un altro problema che si è creato ti posto le righe incriminate.
    Per il momento grazie!
    ℹ️ Leggi di più su lucagalbu ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Array numpy creato da una tupla
    Da lucagalbu nel forum Python
    Risposte: 4
    Ultimo Post: 06-11-2012, 12:18
  2. Accodare velocemente un Array ad un altro Array
    Da Neway nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 08-11-2010, 13:42
  3. Risposte: 3
    Ultimo Post: 12-05-2008, 20:47
  4. array
    Da ste770 nel forum Visual Basic .Net
    Risposte: 3
    Ultimo Post: 01-12-2005, 17:49
  5. Risposte: 2
    Ultimo Post: 05-11-2005, 09:22