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 :

appliquer un facteur correctif à une colonne d'une matrice


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    appliquer un facteur correctif à une colonne d'une matrice
    Bonjour,

    Je ne parviens pas à trouver de façon simple pour appliquer un facteur correctif à une colonne d'une matrice en laissant les autres colonnes inchangées.
    Par exemple, pour passer de :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    [ [1, 9.0, 5.2, 12.3],
      [2, 9.1, 5.0, 12.4],
      [3, 8.9, 5.4, 12.1] ]

    au résultat suivant:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    [ [1, 90, 5.2, 12.3],
      [2, 91, 5.0, 12.4],
      [3, 89, 5.4, 12.1] ]

    c'est-à-dire multiplier par 10 la colonne 1 et ne pas toucher aux autres

    j'ai obtenu le résultat recherché comme suit, mais ça ne me paraît pas très direct (et ça me pose d'autres problèmes quand je veux appliquer différents calculs à différentes colonnes, la concaténation concernerait d'avantage d'éléments qu'ici, et ça ne semble pas permis)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    import numpy as np
    np.concatenate((mamatrice[:,0:1],10*mamatrice[:,1:2],mamatrice[:,2:]), axis=1)


    c'est une chose qui doit être basique mais qui m'échappe.

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Pourquoi rechercher vous à reconstruire la matrice ?
    Vous pouvez juste assigner une nouvelle valeur à la colonne !
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import numpy as np
     
    a = np.array([ [1, 9.0, 5.2, 12.3],
                    [2, 9.1, 5.0, 12.4],
                    [3, 8.9, 5.4, 12.1] ] )
     
    print(a)
    a[:,1]*=10  #### Equivalent de   a[:,1]=10*a[:,1]
    print(a)

  3. #3
    Candidat au Club
    mélange de pinceaux
    J'avais tenté quelque chose comme ça, en créant un objet intermédiaire avec les valeurs corrigées et en modifiant la matrice en conséquence, dans un 2ème temps.
    J'avais eu un conflit de "forme" que je n'ai pas bien saisi, j'ai cru comprendre qu'il fallait soit un vecteur (n_lignes,) soit une matrice colonne (n_lignes,1) mais je n'était pas parvenu à aboutir à une solution.

    Mais maintenant, ça fonctionne!

    Merci :-)

    Dois-je créer un nouveau fil pour l'étape suivante ?
    à savoir; comment n'appliquer ce facteur que pour certaines valeurs de cette colonne

    par exemple, multiplier par 10 uniquement les valeurs de la colonne 1 qui seraient strictement inférieures à 9

  4. #4
    Membre chevronné
    Citation Envoyé par dersol Voir le message
    Dois-je créer un nouveau fil pour l'étape suivante ?
    En principe oui, mais je vous donne une possibilité :

    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
     
    a = np.array([ [1, 9.0, 5.2, 12.3],
                    [2, 9.1, 5.0, 12.4],
                    [3, 8.9, 5.4, 12.1] ] )
     
    print(a)
    for i in range(3):
        if a[i,1] >= 9 :
            a[i,1]*=10  #### Equivalent de   a[i,1]=10*a[i,1]
    print(a)


    Il faut éviter de tous le temps reconstruire les tableaux, il faut les éditer sur place.
    Ici il y a aussi moyen de faire avec np.where, mais ça devient un peu plus compliqué. Avec une boucle dans ce cas précis ça se fait bien.

  5. #5
    Candidat au Club
    np.where
    j'étais effectivement en train de tenter d'utiliser np.where() parce que j'avais compris qu'il fallait éviter les boucles si possibles, et aussi l'imbrication de condition dans des boucles
    ( dans mon cas réel, j'ai en fait 864 000 lignes et 17 colonnes , par jour de mesures)

    je suis arrivée à ça
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import numpy as np
    a = np.array([ [1, 9.0, 5.2, 12.3],
                    [2, 9.1, 5.0, 12.4],
                    [3, 8.9, 5.4, 12.1] ] )
    print(a)
    a[np.where(a[:,1] < 9),1] *= 10
    print(a)


    Merci beaucoup.

    Dans mon cas réel, en fait la colonne corrigée est générée par une liste en compréhension dans laquelle je ne suis pas parvenue à intégrer la condition directement (mais ça devient à présent vraiment très éloigné du fil).

    Je mets le fil en RESOLU.
    Merci encore.