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 :

[Numpy] Transposée d'un vecteur


Sujet :

Calcul scientifique Python

  1. #1
    Membre chevronné
    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
    Par défaut [Numpy] Transposée d'un vecteur
    Bonjour à tous,
    Je suis en train de remplacer Matlab par Numpy, je rencontre pas de problèmes, mi à part celui-ci tout simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    In[13]: o = ones(4)
     
    In [14]: o.shape
    Out[14]: (4,)
     
    In [15]: o = o.transpose()
     
    In [16]: o.shape
    Out[16]: (4,)
    L'opération de transposée ne fonctionne pas sur les matrices 1*n où n*1. Le degré supérieur ne pose pas de problème.

    Pour l'instant, pour contourner le problème je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    In [17]: o.shape = 1,4
     
    In [18]: o = o.transpose()
     
    In [19]: o.shape
    Out[19]: (4, 1)
    afin de forcer la dimension, mais c'est contraignant. Existe-t-il une astuce?
    Merci,
    PS: Sinon, les possibilités des bibliothèques scipy et numpy sont tous simplement géniales... à part le piège du reshape (forcer le reshape "Fortran" pour avoir un comportement matlab).

  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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu essaies de transposer un tableau de taille 4, c'est normal qu'il reste de taille 4
    Contrairement à MatLab, Numpy travaille sur des tableaux de toute dimension. Si tu veux le comportement MatLab, à savoir travailler sur des matrices, tu dois utiliser la classe matrix, tout simplement. A ce niveau, MatLab est clairement déficient, quand on veut un tableau de taille 4, on ne devrait pas obtenir un 4,1 ou un 1,4 !

  3. #3
    Membre chevronné
    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
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Tu essaies de transposer un tableau de taille 4, c'est normal qu'il reste de taille 4
    Ok, je comprends la subtilité. C'est pas très intuitif quand même...

    Citation Envoyé par Matthieu Brucher Voir le message
    Si tu veux le comportement MatLab, à savoir travailler sur des matrices, tu dois utiliser la classe matrix, tout simplement.
    Je veux pas passer par la classe matrix pour ces raisons :
    < Maximum of rank-2. To hold rank-3 data you need array or perhaps a Python list of matrix.
    < Since array is the default in NumPy, some functions may return an array even if you give them a matrix as an argument. This shouldn't happen with NumPy functions (if it does it's a bug), but 3rd party code based on NumPy may not honor type preservation like NumPy does.
    Citation Envoyé par Matthieu Brucher Voir le message
    A ce niveau, MatLab est clairement déficient, quand on veut un tableau de taille 4, on ne devrait pas obtenir un 1,4 !
    Fondamentalement, pour moi, je trouve que c'est la même chose. Un tableau est un vecteur.

    En fait, il suffit d'imposer les dimensions explicitement via un tuple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    In [79]: o = ones((5,1))
     
    In [80]: o.shape
    Out[80]: (5, 1)
     
    In [81]: ot = o.transpose()
     
    In [82]: ot.shape
    Out[82]: (1, 5)
    Merci de ton intervention...

  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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par dahtah Voir le message
    Ok, je comprends la subtilité. C'est pas très intuitif quand même...
    En fait, c'est la manière de MatLab qui n'est pas intuitive, mais elle est rentrée dans les moeurs, avec ses gros défauts. Un tableau à une dimension transposé est identique à ce même tableau, c'est en fait logique, mais pas pour MatLab.
    Matlab ne considère pas qu'un vecteur est un vecteur, mais qu'un vecteur est un vecteur colonne, donc un tableau à 2 dimensions. Mais pourquoi pas un vecteur ligne dans ce cas ? C'est une erreur de conception dans MatLab, et non dans Numpy.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    Matlab ne considère pas qu'un vecteur est un vecteur, mais qu'un vecteur est un vecteur colonne, donc un tableau à 2 dimensions.
    Plus généralement, en interne, MATLAB considère globalement tout objet comme un tableau de type mxArray contenant un vecteur pour stocker la partie entière des valeurs, un autre vecteur pour stocker la partie imaginaire (pas toujours utilisée) et quelques informations en entête dont les dimensions du tableau. Les parties réelle et imaginaire sont stockées colonne par colonne en mémoire (seul héritage du Fortran initial)

    => http://www.mathworks.com/access/help...al/f21585.html

    Il n'y a donc pas de différence entre un scalaire, un vecteur ou un tableau. Ce sont tous des tableaux.

    Même pour un tableau vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> a = []
     
    a =
     
         []
     
    >> size(a)
     
    ans =
     
         0     0
    Maintenant, de la à y voir une erreur de conception... peut être mais en 10 ans de développement MATLAB, je ne me suis jamais trop senti limité par ce choix de conception

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2012, 19h44
  2. Réponses: 3
    Dernier message: 22/06/2011, 10h20
  3. [Numpy] Transposer une matrice par bloc
    Par tazgero dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 02/10/2010, 12h42
  4. Transposer un vecteur
    Par habasque dans le forum R
    Réponses: 2
    Dernier message: 15/05/2009, 10h26
  5. transposée vecteur ligne -> vecteur colonne
    Par Pierre845 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/03/2008, 18h29

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