IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

etendre scipy.ndimage avec une fonction C


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut etendre scipy.ndimage avec une fonction C
    Bonjour,

    J'essaie d'utiliser geometric_transform de scipy.ndimage avec une fonction de mapping écrite en C pour accélerer le code.

    J'essaie avec l'example du tuto ( " Extending ndimage in C" (http://docs.scipy.org/doc/scipy/refe...age-ccallbacks) mais celui ci ne semble pas être correct (pb de compilation).

    ##############################################
    static int
    _shift_function(int *output_coordinates, double* input_coordinates,
    int output_rank, int input_rank, void *callback_data)
    {
    int ii;
    /* get the shift from the callback data pointer: */
    double shift = *(double*)callback_data;
    /* calculate the coordinates: */
    for(ii = 0; ii < irank; ii++)
    icoor[ii] = ocoor[ii] - shift;
    /* return OK status: */
    return 1;
    }
    ##############################################

    gcc example.c --shared -lpython -o example.so
    Compile error :

    example.c: In function ?_shift_function?:
    example.c:12: error: ?irank? undeclared (first use in this function)
    example.c:12: error: (Each undeclared identifier is reported only once
    example.c:12: error: for each function it appears in.)
    example.c:13: error: ?icoor? undeclared (first use in this function)
    example.c:13: error: ?ocoor? undeclared (first use in this function)
    *************************************************************

    Je modifie le code pour que la compilation passe :

    ##############################################
    static int
    _shift_function(int *output_coordinates, double* input_coordinates,
    int output_rank, int input_rank, void *callback_data)
    {
    int ii;
    /* get the shift from the callback data pointer: */
    double shift = *(double*)callback_data;
    /* calculate the coordinates: */
    for(ii = 0; ii < input_rank; ii++)
    input_coordinates[ii] = output_coordinates[ii] - shift;
    /* return OK status: */
    return 1;
    }
    ##############################################

    Mais le résultat attendu n'est pas correct.

    ##############################################
    a = np.arange(12.).reshape((4, 3))
    fnc= example.shift_function(0.5)
    print ndimage.geometric_transform(a, fnc)

    array([[ 0., 0., 0.],
    [ 0., 0., 0.],
    [ 0., 0., 0.],
    [ 0., 0., 0.]])

    au lieu de :

    [[ 0. 0. 0. ]
    [ 0. 1.3625 2.7375]
    [ 0. 4.8125 6.1875]
    [ 0. 8.2625 9.6375]]
    ##############################################

    Une idée du problème...?
    Merci d'avance

    Eric

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il y a une balise pour le code

    Outre le fait qu'on ne voit pas tout le code, clairement, tu n'as pas appliqué l'appel qui va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array = arange(12, shape=(4,3), type = numpy.float64)

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok merci pour la balise
    Voilà le code donc copier coller avec correction des erreurs pour la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <stdio.h>
    #include <Python/Python.h>
     
    static int 
    _shift_function(int *output_coordinates, double* input_coordinates,
                    int output_rank, int input_rank, void *callback_data)
    {
        int ii; 
        /* get the shift from the callback data pointer: */ 
        double shift = *(double*)callback_data;
     
        /* calculate the coordinates: */ 
        for(ii = 0; ii < input_rank; ii++){
            input_coordinates[ii] = output_coordinates[ii] - shift; 
            }
        /* return OK status: */ 
        return 1;
    }
     
    static void 
    _destructor(void* cobject, void *cdata) 
    {
        if (cdata) 
            free(cdata);
    }
     
    static PyObject * 
    py_shift_function(PyObject *obj, PyObject *args) 
    {
        double shift = 0.0; 
        if (!PyArg_ParseTuple(args, "d", &shift)) {
            PyErr_SetString(PyExc_RuntimeError, "invalid parameters");
            return NULL; 
        } 
        else {
        /* assign the shift to a dynamically allocated location: */
        double *cdata = (double*)malloc(sizeof(double)); 
        *cdata = shift; 
        /* wrap function and callback_data in a CObject: */ 
        return PyCObject_FromVoidPtrAndDesc(_shift_function, cdata,
                                            _destructor);
        }
    }
     
    static PyMethodDef methods[] = { 
        {"shift_function", (PyCFunction)py_shift_function, METH_VARARGS, ""}, 
        {NULL, NULL, 0, NULL}
    };
     
    void initexample(void) {
        Py_InitModule("example", methods);
    }

    Mais le résulat final n'est pas bon.
    De plus,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    array = arange(12, shape=(4,3), type = numpy.float64)
    n'est pas une syntaxe correct de numpy...?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oups, si tu as importé numpy, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array = numpy.arange(12, shape=(4,3), dtype = numpy.float64)
    J'ai reporté le bug, comme tu as pu le constater, on verra les changements dans la doc.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui merci. J'espère que ca réagira vite

    Sinon même ce bout de code n'est pas correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array = numpy.arange(12, shape=(4,3), dtype = numpy.float64)
    cf.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numpy.arange([start], stop[, step], dtype=None)
    A moins que ce soit l'ancienne fonction de Numeric mais là je connais pas...

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ah, effectivement, le shape doit être placé dehors. On va dire que ça se sent que c'est le week-end !

Discussions similaires

  1. [Lisp] Communiquer avec une fonction en c++
    Par Nadine dans le forum Lisp
    Réponses: 5
    Dernier message: 10/01/2005, 21h15
  2. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 13h33
  3. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 02h15
  4. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 17h37
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo