2015-01-31 41 views
5

Sono abbastanza nuovo per Python e sto provando a creare una funzione per moltiplicare un vettore per matrice (di qualsiasi dimensione di colonna). esempio:Python 3: moltiplica un vettore per matrice senza NumPy

multiply([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 

[1, 1] 

Ecco il mio codice:

def multiply(v, G): 
    result = [] 
    total = 0 
    for i in range(len(G)): 
     r = G[i] 
     for j in range(len(v)): 
      total += r[j] * v[j] 
     result.append(total) 
    return result 

Il problema è che quando cerco di selezionare la prima riga di ogni colonna della matrice (r [j]) l'errore 'lista indice fuori intervallo 'è mostrato. C'è un altro modo per completare la moltiplicazione senza usare NumPy?

risposta

7

L'approccio Numpythonic: (usando numpy.dot al fine di ottenere il prodotto scalare di due matrici)

In [1]: import numpy as np 

In [3]: np.dot([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 
Out[3]: array([1, 1]) 

L'approccio Pythonic:

La lunghezza del vostro secondo for ciclo è len(v) e si tenta di indicizzazione v in base a ciò quindi hai ottenuto l'errore di indice. Come un modo più divinatorio è possibile utilizzare zip funzione per ottenere le colonne di un elenco quindi utilizzare starmap e mul all'interno di una lista di comprensione:

In [13]: first,second=[1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 

In [14]: from itertools import starmap 

In [15]: from operator import mul 

In [16]: [sum(starmap(mul, zip(first, col))) for col in zip(*second)] 
Out[16]: [1, 1] 
+1

Questo non sembra adatto per un principiante. – physicalattraction

+1

@physicalattraction aggiungerò altra descrizione;) – Kasramvd

+0

Grazie. Non mi ero imbattuto nella funzione zip - lo rende molto più semplice! Un'ultima cosa, sto ricevendo un errore di sintassi quando provo a restituire la somma (mul (k, t)). Sono evidenziate le parentesi quadre esterne, che presumo restituisce la somma come una lista? – JGraham353

2

r è un elemento da G quindi è una riga che ha solo due elementi. Ciò significa che non è possibile utilizzare l'indice j per ottenere un valore da r perché j passa da 0 alla lunghezza di v, che è 6 nell'esempio.

1

avevo bisogno soluzione in cui la prima matrice potrebbe essere 2-dimensionale. Estendere la soluzione da @Kasramvd per accettare una matrice bidimensionale first. Postato qui per riferimento:

>>> first,second=[[1,0,0,1,0,0],[0,1,1,1,0,0]], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 
>>> from itertools import starmap 
>>> from operator import mul 
>>> [[sum(starmap(mul, zip(row, col))) for col in zip(*second)] for row in first] 
[[1, 1], [3, 1]] 
2

Credo che il problema con il codice è stato che si esegue un ciclo attraverso le righe della matrice, piuttosto che dalle colonne. Inoltre, non si ripristina la variabile 'totale' dopo ogni calcolo della colonna della matrice vettore *. Questo è ciò che si vuole:

def multiply(v, G): 
    result = [] 
    for i in range(len(G[0])): #this loops through columns of the matrix 
     total = 0 
     for j in range(len(v)): #this loops through vector coordinates & rows of matrix 
      total += v[j] * G[j][i] 
     result.append(total) 
    return result 
0

Ho allegato un codice per la moltiplicazione di matrici fanno seguire il formato ad esempio per una moltiplicazione dimensionale (liste di lista)

def MM(a,b): 
c = [] 
for i in range(0,len(a)): 
    temp=[] 
    for j in range(0,len(b[0])): 
     s = 0 
     for k in range(0,len(a[0])): 
      s += a[i][k]*b[k][j] 
     temp.append(s) 
    c.append(temp) 

return c 
a=[[1,2]] 
b=[[1],[2]] 
print(MM(a,b)) 

risultato è [[5]]