Adloun

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.