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

Python Discussion :

Difficulté à sommer des numpy.arrays


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Points : 100
    Points
    100
    Par défaut Difficulté à sommer des numpy.arrays
    Bonjour,

    j'ai un petit souci (comme souvent). Il doit y avoir quelque chose qui m'échappe dans l'utilisation des numpy.arrays.
    Voici le code incriminé :

    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
    import numpy
     
    def func(x):    
        return [x,x]
     
    a=[[1,1],[2,2],[3,3]]
    a=numpy.array(a)
     
    print a
    print numpy.shape(a)
    print type(a)
     
    b=numpy.frompyfunc(func,1,1)([1,2,3])
    print b
    print numpy.shape(b)
    print type(b)
     
    #b=numpy.array(b.tolist())
     
    print a+b
    Ce code exécuté tel quel m'interdit la somme finale (ValueError: shape mismatch: objects cannot be broadcast to a single shape
    ). Or on possède bien deux numpy.arrays qui contiennent les mêmes valeurs. Seul la "shape" est diffférente, et c'est bien ça le problème.
    1 - Pourquoi un coup il s'agit de (3,2) et un coup de (3,) ?

    Du coup j'essaierai bien de faire en sorte que l'utilisation de frompyfunc me renvoit un tableau avec la bonne shape, mais je ne vois pas comment...
    2 - Une idée sur l'utilisation de numpy.frompyfunc ?

    Alors, bien sûr, j'ai une solution de secours : dé-commenter la ligne commentée. Ceci dit, je ne comprends pas pourquoi elle fonctionne : prendre un array, le convertir en liste pour le reconvertir en array : et hop, il récupère une bonne "shape" !C'est un peu mystérieux et je dois perdre en performance.

    Bref, je suis preneur de toute solution me permettant d'appeler via frompyfunc une fonction que j'ai définie, et d'obtenir en sortie des tableaux avec des "shapes" normales, c'est à dire qui finissent pas sur une virgule !

    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 942
    Points : 7 353
    Points
    7 353
    Par défaut
    Tu as essayé avec numpy.add ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import numpy
    numpy.add(a, b)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Points : 100
    Points
    100
    Par défaut
    Il n'y a aucune différence entre numpy.add et +, ce qui semble peu surprenant en fait. On tombe sur la même erreur...

    Mais merci quand même !

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Salut,
    Alors il y a plusieurs choses :

    Citation Envoyé par Loïc B. Voir le message
    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
     
    import numpy
     
    def func(x):    
        return [x,x]
     
    a=[[1,1],[2,2],[3,3]]
    a=numpy.array(a)
     
    print a
    print numpy.shape(a)
    print type(a)
     
    b=numpy.frompyfunc(func,1,1)([1,2,3])
    print b
    print numpy.shape(b)
    print type(b)
     
    #b=numpy.array(b.tolist())
     
    print a+b
    Voilà ce que je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import numpy
     
    def func(x):
        # en notation matlab [3;5] devient [3,3;5,5] (on "duplique" la matrice verticalement). C'est en partie pourquoi tes dimensions n'allaient pas   
        return concatenate((x,x),1)
     
    #Ici, tu dois passer un vecteur colonne et non pas ligne
    #La présence des doubles crochets force une initialisation à la forme (3,1) et non pas (3,)
    b=numpy.frompyfunc(func,1,1)(numpy.array([[1,2,3]]).transpose())
    Maintenant, tes dimensions sont identiques et tu pourras sommer tes vecteurs.
    J'espère que ça correspond à ce que tu attendais...
    Ah, et si tu viens du monde matlab, ceci peut t'aider.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Points : 100
    Points
    100
    Par défaut
    Bon merci pour vos réponses.

    Mais finalement, pour convertir mes listes en tableaux à 2 dimensions, j'ai trouvé une fonction de numpy qui permet de faire une conversion plus sensée que le précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b=numpy.array(b.tolist())
    J'utilise maintenant :
    Puisqu'en fait c'est bien de ça qu'il s'agit, je souhaitais 2 dimensions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. numpy array, extraire des tranches?
    Par jean-pat dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 11/03/2011, 11h46
  2. des difficultés sur des methodes
    Par bambi98 dans le forum UML
    Réponses: 4
    Dernier message: 12/12/2006, 10h32
  3. [Oracle] Sommer des montants de devises différentes
    Par ben53 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/11/2006, 15h08
  4. [Oracle 8i]Sommer des temps
    Par venusiafalls dans le forum Oracle
    Réponses: 15
    Dernier message: 19/07/2005, 11h09
  5. Performance des vertex array
    Par Mathieu.J dans le forum OpenGL
    Réponses: 13
    Dernier message: 25/06/2004, 11h47

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