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 :

Boucle en python


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut Boucle en python
    Bonjour,

    Je débute sur python et je cherche à passer un code de Matlab en ce dernier.
    s est un signal de longueur 228352
    N = 11025
    et je veux créer sif tel que:

    voici en matlab:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ii = 1:round(size(s,1)/N)-1
        sif(ii,:) = s(1+(ii-1)*N:ii*N);
    end
    que je traduis en python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    iend=np.arange(round(len(s)/N))
    iend=len(iend)-1
    sif=np.ones((iend,len(s)))
     
    for ii in range(iend):
       sif[ii,:]=s[1+ii*N:(ii+1)*N]
    avec comme erreur:

    ValueError: could not broadcast input array from shape (11024) into shape (228352)
    je comprends pas pourquoi il parle des shapes de N et de s là..

    Merci pour toute aide.
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Quand vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           sif[ii,:]=s[1+ii*N:(ii+1)*N]
    Vous voulez copier les N valeurs successives (1+ii*Nii+1)*N) de s.
    Le message d'erreur vous dit seulement que ce N là ne correspond pas au nombre de cases de sif[ii,:]

    La vraie question serait plutôt "pourquoi écrire sif=np.ones((iend,len(s))) plutôt que sif=np.ones((iend,N)) ?"

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Merci pour votre réponse,

    effectivement, la taille de sif est bien iend, N
    Mais j'image que si on se trompe sur la taille de sif avant la boucle ce n'est pas très grave non? juste comme Matlab, ça ne sert qu'à gagner du temps de calcul?

    Mais en changeant cela:

    j'ai toujours le même msg d'erreur

    ValueError: could not broadcast input array from shape (0) into shape (206)
    .. je ne comprends pas d'où vient le "from shape (0)"
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Newenda Voir le message
    .. je ne comprends pas d'où vient le "from shape (0)"
    Ca vient toujours de la dimension de la séquence qu'on veut recopier ("from shape").
    Par curiosité, vous pourriez lancer la console Python pour voir les différents messages d'erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> import numpy as np
    >>> ar = np.ones((3, 5))
    >>> ar[0,:] = np.ones(0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: could not broadcast input array from shape (0) into shape (5)
    >>> ar[0,:] = np.ones(6)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: could not broadcast input array from shape (6) into shape (5)
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    ha ma première erreur a été d'oublier qu'on incrémente à partir de 1 dans matlab et 0 dans python (pourquoi d'ailleurs, étonnant de commencer à 0 mais bon..)

    donc j'ai changé un peu ma boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      for ii in range(iend):
             sif[ii,:]=s[1+(ii)*N:(ii+1)*N]
    mais toujours:

    ValueError: could not broadcast input array from shape (11024) into shape (11025)
    Désolé, dans ce cas je ne vois pas d'où vient le 11024 et donc je vois pas trop bien le corriger.. le sif.shape me retourne bien (206,11025)

    j'essaye naivement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    In [28]: for ii in range(iend):
        ...:     sif[ii,:]=s[1+(ii)*(N+1):(ii+1)*(N+1)]
        ...:
    mais me retourne:

    /home/anaconda2/bin/ipython:2: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
    if __name__ == '__main__':
    C'est grave?
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Newenda Voir le message
    Désolé, dans ce cas je ne vois pas d'où vient le 11024 et donc je vois pas trop bien le corriger.. le sif.shape me retourne bien (206,11025)

    Ce 11024 vient de 1+(ii)*N:(ii+1)*N.
    Et comme vous l'avez remarqué Python commence à 0.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce 11024 vient de 1+(ii)*N:(ii+1)*N.
    Et comme vous l'avez remarqué Python commence à 0.

    - W
    donc vous êtes d'accord avec la correction suivante ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    In [28]: for ii in range(iend):
        ...:     sif[ii,:]=s[1+(ii)*(N+1):(ii+1)*(N+1)]
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Newenda Voir le message
    donc vous êtes d'accord avec la correction suivante ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    In [28]: for ii in range(iend):
        ...:     sif[ii,:]=s[1+(ii)*(N+1):(ii+1)*(N+1)]
    C'est à vous de vérifier que sif[ii,:] récupère bien ce qui est attendu (et expliquer pourquoi commencer à 1 plutôt qu'à zéro...)
    Pourquoi ne pas utiliser des fonctionnalités de numpy comme reshape, copy,... ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 002
    Points : 476
    Points
    476
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pourquoi ne pas utiliser des fonctionnalités de numpy comme reshape, copy,... ?

    - W
    Effectivement, comme la boucle ne sert qu'à découper le vecteur en bout de N élements, on pourrait utiliser reshape:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shapeS=(iend,N)
    sif=s.reshape(shapeS)
    le problème étant que N est mal défini et que la longueur de l'array S ne correspond pas exactement à iend * N,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    In [23]: len(s)
    Out[23]: 2283520
     
    In [24]: N
    Out[24]: 1764.0
     
    In [25]: iend
    Out[25]: 1294
     
    In [26]: N*iend
    Out[26]: 2282616.0
    Donc je me retrouve un peu bloqué..

    Je pensais enlever un certain nombre d'échantillon à la fin de S pour qu'on ai un iend*N=S possible et ainsi pouvoir réaliser un matrice correct mais

    ne marche pas..

    ValueError Traceback (most recent call last)
    <ipython-input-31-64c1f85be291> in <module>()
    ----> 1 del s[N*iend:len(s)]

    ValueError: cannot delete array elements
    comprends pas..

    y'a moyen d'utiliser reshape en lui disant: tu reshape tous les éléments de s dans une matrice de telle dimension et si il en reste pas assez pour faire une autre ligne de matrice tu ne l'as met pas?

    merci
    OS : taff > Window 7 32bit - Home > Windows 7 64bit
    Matlab : taff > v2013b - Home > r2009a

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Newenda Voir le message
    y'a moyen d'utiliser reshape en lui disant: tu reshape tous les éléments de s dans une matrice de telle dimension et si il en reste pas assez pour faire une autre ligne de matrice tu ne l'as met pas?
    reshape ne fabrique pas une copie mais une "view" sur le tableau d'origine.
    Par contre, on peut dire de faire un reshape des éléments de m a n:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> import numpy as np
    >>> N = 5
    >>> a = np.zeros(23)
    >>> q = 23//5
    >>> v = a[2:q*N+2].reshape((q, N))
    >>> v[3, 4] = 1
    >>> a
    array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
            0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.])
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. les conditions et les boucles en Python
    Par mido1951 dans le forum Général Python
    Réponses: 10
    Dernier message: 31/01/2017, 01h52
  2. optimiser les boucles en python
    Par huître dans le forum Général Python
    Réponses: 2
    Dernier message: 11/08/2015, 15h48
  3. des boucles sous python
    Par hibouchka dans le forum Général Python
    Réponses: 7
    Dernier message: 07/04/2011, 13h29
  4. boucle for python
    Par space_56 dans le forum Général Python
    Réponses: 3
    Dernier message: 22/01/2011, 13h06
  5. Boucles sur python
    Par Spitfire378 dans le forum Général Python
    Réponses: 10
    Dernier message: 08/04/2007, 20h46

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