Inscription / Connexion Nouveau Sujet
Niveau maths spé
Partager :

matrice python

Posté par
termina123
01-11-21 à 16:22

Bonjour
Sur pyzo je veux remplacer la ligne d'une matrice, ça fonctionne pour une matrice de taille 3x3 mais pas 4x4

B=np.array([4,-1,-1,0,-1,4,-1,-1,-1,-1,4,-1,0,-1,-1,4]).reshape(4,4)
l=B[1,0]/B[0,0]
B[1]=B[1]-l*B[0]
print(B)

et ca me met n'importe quoi pour la 2ème ligne  je comprends vraiment pas
B[1]-l*B[0]=array([ 0.  ,  3.75, -1.25, -1.  ]) ça c'est bon
mais quand j'écris B[1]=B[1]-l*B[0] et que j'affiche B c'est pas bon d'ailleurs je comprends meme pas les calculs qui ont été fait

Posté par
flight
re : matrice python 01-11-21 à 17:03

salut

connais pas trop python mais les principes de programmation sont les memes pour tout les langages , vois cet exemple en vba  si jamais cela peut t'aiguiller :

Citation :
Sub manip_matrice()
mat = Array(Array(1, 2, 3, 4), Array(4, 5, 6, 7), Array(7, 8, 9, 10), Array(11, 12, 13, 14))

vecteur = CInt(InputBox("saisir le rang du vecteur à modifier")) '--> 0 , 1 ou 2
For i = 0 To UBound(mat)
mat(vecteur)(i) = InputBox("saisir la valeur de la composante" & i + 1)
Next
For i = 0 To UBound(mat)
  MsgBox Join(mat(i), " ")  'pour verifier les nouvelles composantes
Next
End Sub

Posté par
alb12
re : matrice python 01-11-21 à 17:04

salut,
B est une matrice d'entiers, change le 4 en 4.0

Posté par
Ulmiere
re : matrice python 01-11-21 à 18:16

Pour la prochaine fois, évite d'appeler tes variables l, ça ressemble beaucoup à un 1. Tu peux aussi formater ton code entre les balises [code] et [/code].

Ton problème vient du fait que tu assignes une matrice contenant des float à une matrice d'entiers.

Cette ligne

B=np.array([4,-1,-1,0,-1,4,-1,-1,-1,-1,4,-1,0,-1,-1,4])

crée une matrice d'entiers

Mais cette expression
B[1]-l*B[0] 

renvoie une matrice de flottants, parce que l = -1/4 = -0.25 ici

Quand tu exécutes l'expression ci-dessus, Python convertit (dans une variable temporaire) B[0] et B[1] (vecteurs d'entiers) en vecteurs de flottants et le résultat de l'opération est donc un vecteur de flottants [ 0.    3.75 -1.25 -1.  ].

Mais quand tu mets ce résultat dans B[1], et comme Python est dynamiquement typé, le résultat du calcul est converti une nouvelle fois, cette fois en un vecteur d'entiers. Le 3.75 est converti en 3 et le -1.25 est converti en -1 (troncature) et donc tu obtiens le vecteur d'entiers [1 3 -1 1]

La solution : tu expliques à Python que B est à considérer comme une matrice de flottants
et tu dois donc lui donner le paramètre dtype explicitement
B = np.array([4,-1,-1,0,-1,4,-1,-1,-1,-1,4,-1,0,-1,-1,4], dtype="float").reshape(4,4)


et le résultat sera

[[ 4.   -1.   -1.    0.  ]
[ 0.    3.75 -1.25 -1.  ]
[-1.   -1.    4.   -1.  ]
[ 0.   -1.   -1.    4.  ]]

Alternativement, tu peux aussi faire comprendre à Python que B est un vecteur de flottants en passant à np.array un vecteur de flottants.
Pour cela, remplace par exemple le premier 4 par un 4.0 : [4.0,-1,-1,0,-1,4,-1,-1,-1,-1,4,-1,0,-1,-1,4].
numpy comprendra tout seul que, le type d'un vecteur devant être homogène, toutes les autres valeurs sont à convertir en float aussi

Posté par
termina123
re : matrice python 07-11-21 à 17:41

Merci pour l'explication

Posté par
alb12
re : matrice python 07-11-21 à 18:17

Les remerciements les plus courts sont les meilleurs



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !