+ 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