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

Discussione: Numpy Array e PyArrayObject

  1. #1
    lucagalbu non è in linea Scolaretto
    Luogo
    Italy
    Post
    244

    Numpy Array e PyArrayObject

    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
    codice:
    PyArrayObject* ptr;
    Il numpy array è un array monodimensionale a due celle di tipo double. Per accedere ai suoi dati usando ptr dovrei scrivere
    codice:
    <numpy array cella k>=ptr->data+k*ptr->stride[0];
    Ora, io ho notato che in realtà posso anche accedervi così
    codice:
    double *ptr2=((double*)(ptr->data));
    cout << ptr2[0] << "  " << ptr[1] << endl;
    È un caso che così funzioni, o è un metodo che si può usare?
    Colui che pone una domanda è uno sciocco per cinque minuti; colui che non pone una domanda rimane uno sciocco per sempre

  2. #2
    Post
    4,741
    Blogs
    12
    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:

    codice:
    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:

    codice:
    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:

    codice:
    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
    Luogo
    Italy
    Post
    244
    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.
    Colui che pone una domanda è uno sciocco per cinque minuti; colui che non pone una domanda rimane uno sciocco per sempre

  4. #4
    Post
    4,741
    Blogs
    12
    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
    Luogo
    Italy
    Post
    244
    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!
    Colui che pone una domanda è uno sciocco per cinque minuti; colui che non pone una domanda rimane uno sciocco per sempre

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi