2013-03-27 12 views
1

Je sais que les étapes pour multiplier deux matrices sont les suivantesComment multiplier chaque ligne dans une matrice par chaque colonne de la deuxième matrice en Python?

Étape 1: Assurez-vous que le nombre de colonnes dans le 1er est égal au nombre de lignes dans le 2ème. Étape 2: Multiplier les éléments de chaque rangée de la première matrice par les éléments de chaque colonne dans la deuxième matrice.

Étape 3: Ajouter les produits.

Comment faites-vous la deuxième étape?

Par exemple

A = [[3,4,5],[5,0,6],[5,7,1]] 

B = [[2,1,3],[2,6,4]] 

Jusqu'à présent, j'obtenu une fonction pour trouver chaque colonne pour la seconde

def column(B,j): 
    col = [] 
    for column in B: 
     col.append(column[j]) 
    return col 

Ensuite, je vais devoir faire une fonction qui trouve chaque ligne pour la première

def rows(A,i): 

Mais alors je ne sais pas comment créer une fonction qui va les multiplier comme

row(A,0) • col(B,0) 

row(A,0) • col(B,1) 

row(A,1) • col(B,0) 

row(A,1) • col(B,1) 

row(A,2) • col(B,0) 

row(A,2) • col(B,1) 
+1

Y at-il une raison pour laquelle utilisez-vous pas numpy pour cela? – immerrr

+0

@immerrr Oui Im supposer l'apprendre sans utiliser numpy d'abord. – Jett

Répondre

2

Vous devriez probablement utiliser numpy:

import numpy as np 
np.dot(row(A,0), col(B,0)) 

Cependant, en supposant que vous ne voulez pas l'utiliser, vous pouvez faire:

def dot(arr1, arr2): 
    return sum([x*y for x,y in zip(arr1, arr2)]) 

dot(row(A,0), col(B,0)) 
1

Si vous insistez sur l'utilisation des listes pour cette ....

Pour C = AB, vous avez besoin

C_ {ij} = somme (A_ {ik} * {B_ kj}

Ici, i, j et k sont des indices, le premier indice désignant la ligne et le second indiquant la colonne. i, j, k parcourt les lignes et les colonnes (c'est-à-dire, les indices de liste) de la matrice, de sorte que vous pouvez simplement écrire des boucles sur i, j et k.

1

A a 3 colonnes, tandis que B dispose de 2 lignes . Donc, votre exemple semble contredire l'exigence énoncée à l'étape 1. Néanmoins, cela pourrait être proche de ce que vous recherchez.

In [1]: A = [[3,4,5],[5,0,6],[5,7,1]] 

In [2]: B = [[2,1,3],[2,6,4]] 

In [3]: [[sum(r*c for r,c in zip(row, col)) for col in B] for row in A] 
Out[3]: [[25, 50], [28, 34], [20, 56]] 

D'ailleurs, voici une astuce utile qui peut vous être utile: Si vous souhaitez transposer une matrice, utilisez zip(*B):

In [4]: zip(*B) 
Out[4]: [(2, 2), (1, 6), (3, 4)] 

Cela peut être utile pour vous car il vous permet de parcourir facilement les colonnes de B.

+0

Je pense que le code original a des colonnes dans les listes internes, donc vous devez d'abord compresser (* A), sinon vous ferez le col-par-col plutôt que la multiplication rangée par colonne. – immerrr

0

Voici un exemple élaboré:

>>> from pprint import pprint 
>>> def mmul(A, B): 
     nr_a, nc_a = len(A), len(A[0]) 
     nr_b, nc_b = len(B), len(B[0]) 
     if nc_a != nr_b: 
      raise ValueError('Mismatched rows and columns') 
     return [[sum(A[i][k] * B[k][j] for k in range(nc_a)) 
       for j in range(nc_b)] for i in range(nr_a)] 

>>> A = [[1, 2, 3, 4]] 
>>> B = [[1], 
     [2], 
     [3], 
     [4]] 

>>> pprint(mmul(A, B)) 
[[30]] 

>>> pprint(mmul(B, A), width=20) 
[[1, 2, 3, 4], 
[2, 4, 6, 8], 
[3, 6, 9, 12], 
[4, 8, 12, 16] 
Questions connexes