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

Numpy Array e PyArrayObject

  1. #1
    lucagalbu non è in linea Scolaretto
    Post
    244
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    Post
    4,903
    Blogs
    9
    Like Inviati  
    55
    Like Ricevuti  
    31
    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
    Post
    244
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    Post
    4,903
    Blogs
    9
    Like Inviati  
    55
    Like Ricevuti  
    31
    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
    Post
    244
    Like Inviati  
    0
    Like Ricevuti  
    0
    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