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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    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 éprouvé
    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
    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)"

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    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 éprouvé
    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
    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?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    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

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