2016-05-17 2 views
7

Diciamo Ho una matrice in questo modo:operazioni elemento-saggio di matrice in pitone

matrix1 = [[11,12,13,14,15,16,17],[21,22,23,24,25,26,27],[31,32,33,34,35,36,37], 
      [41,42,43,44,45,46,47],[51,52,53,54,55,56,57],[61,62,63,64,65,66,67], 
      [71,72,73,74,75,76,77]] 

e voglio fare una funzione che prenderà in due matrici e fare puntuale moltiplicazione. (non usando numpy)

Ho visto alcune cose sull'utilizzo di zip ma non sembra funzionare per me. Penso che sia perché la mia lista è di liste e non una sola lista.

Il mio codice:

def pointwise_product(a_matrix, a_second_matrix): 
    # return m[i][j] = a_matrix[i][j] x a_second_matrix[i][j] 
    return [i*j for i,j in zip(a_matrix,a_second_matrix)] 

Matrice1 potrebbe essere inserito come entrambi gli argomenti qui. una seconda funzione chiamata display_matrix prenderebbe questa funzione e visualizzerà ogni elemento degli elenchi su nuove righe, ma questo va oltre lo scopo di questa domanda.

la mia ipotesi è che avrò bisogno di alcune list comprehensions o funzioni lambda ma sono semplicemente troppo nuovo per Python per comprenderle.

risposta

6

Avrete bisogno di una comprensione annidata poiché avete una lista 2D. È possibile utilizzare il seguente:

[[i * j for i, j in zip(*row)] for row in zip(matrix1, matrix2)] 

Ciò comporterà quanto segue per il tuo esempio (matrix1 * matrix1):

[[121, 144, 169, 196, 225, 256, 289], 
[441, 484, 529, 576, 625, 676, 729], 
[961, 1024, 1089, 1156, 1225, 1296, 1369], 
[1681, 1764, 1849, 1936, 2025, 2116, 2209], 
[2601, 2704, 2809, 2916, 3025, 3136, 3249], 
[3721, 3844, 3969, 4096, 4225, 4356, 4489], 
[5041, 5184, 5329, 5476, 5625, 5776, 5929]] 
+1

Stavo per rispondere con un approccio _identico_, bello :) – miradulo

0

Che dire

def pw(m1, m2): 
    """ 
    Given two lists of lists m1 and m2 of the same size, 
    returns the point-wise multiplication of them, like matrix point-wise multiplication 
    """ 
    m = m1[:] 

    for i in range(len(m)): 
     for j in range(len(m[i])): 
      m[i][j] = m1[i][j]*m2[i][j] 

    return m 

m = [[1,2,3], [4,5,6]] 
assert([[1*1, 2*2, 3*3], [4*4, 5*5, 6*6]] == pw(m,m)) 

C'è una ragione per l'ottimizzazione prematura? Se sì, quindi usare numpy.