Deux produits qui n'en sont pas un
Exercice · niveau 1 (application) · mathématiques approfondies (ECG 1re année), chapitre 11 — Informatique et algorithmique · Matrices et systèmes linéaires
Énoncé
Comparer M * M et np.dot(M, M) pour . Expliquer.
Corrigé
import numpy as np
M = np.array([[1, 1], [0, 1]])
print(M * M) # [[1, 1], [0, 1]]
print(np.dot(M, M)) # [[1, 2], [0, 1]]
print(M @ M) # [[1, 2], [0, 1]] -- meme chose, mais np.dot
# est la seule syntaxe exigible
Ils diffèrent, et ce n'est pas un défaut de numpy.
M * M est le produit terme à terme (dit de Hadamard) : chaque coefficient est élevé au carré. D'où .
np.dot(M, M) — ou M @ M — est le produit matriciel du cours, . D'où , ce que le calcul à la main confirme : le coefficient vaut .
L'erreur est silencieuse, et c'est ce qui la rend dangereuse : les deux résultats ont la même taille, aucun message n'est émis, et le programme continue avec des nombres faux. La règle : dans numpy, <em> est toujours* terme à terme ; pour le produit matriciel, écrire @.
Un contrôle utile : . Si le coefficient en haut à droite ne croît pas, c'est qu'on n'a pas fait le bon produit.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.