2015-01-31 23 views
5

Jestem całkiem nowy w Pythonie i próbuję utworzyć funkcję do mnożenia wektora przez macierz (o dowolnym rozmiarze kolumny). npPython 3: Pomnożenie wektora przez macierz bez NumPy

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

[1, 1] 

Oto mój kod:

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 

Problemem jest to, że gdy próbuję wybrać pierwszy wiersz każdej kolumny w macierzy (R [j]) błąd „listy indeks poza zasięgiem ". Czy istnieje inny sposób wykonania mnożenia bez użycia NumPy?

Odpowiedz

7

Numpythonic podejście: (używając numpy.dot w celu uzyskania iloczynu skalarnego dwóch matryc)

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]) 

Podejście pythonowy:

Długość drugiego for pętli len(v) i próby indeksowanie v w oparciu o to, więc masz indeks Błąd. Jako bardziej pythonic sposób można użyć zip funkcję, aby uzyskać kolumny listy użyj starmap i mul w listowego:

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

To nie wygląda na odpowiednie dla początkujących. – physicalattraction

+1

@physicalattraction dodaję więcej opisu;) – Kasramvd

+0

Dzięki. Nie natknąłem się na funkcję zip - czyni to o wiele łatwiejszym! Ostatnią rzeczą, otrzymuję błąd składniowy, gdy próbuję zwrócić sumę (mul (k, t)). Podkreślono zewnętrzne nawiasy kwadratowe, które, jak przypuszczam, zwracają sumę jako listę? – JGraham353

2

r jest elementem z G, więc jest to wiersz, który ma tylko dwa elementy. Oznacza to, że nie można użyć indeksu j, aby uzyskać wartość od r, ponieważ j przechodzi od 0 do długości v, co w przykładzie wynosi 6.

1

Potrzebowałem rozwiązanie, w którym pierwsza macierz mogłaby być 2-wymiarowe. Rozszerzenie rozwiązania z @Kasramvd do zaakceptowania dwuwymiarowej macierzy first. Zamieszczone tutaj w celach informacyjnych:

>>> 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

Myślę, że problem z twoim kodem polegał na tym, że przeglądasz wiersze macierzy, a nie kolumny. Nie zmieniasz także swojej "całkowitej" zmiennej po każdym obliczeniu kolumny matrycy wektora. To jest to, co chcesz:

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

I został dołączony kod do mnożenia macierzy zrobić naśladowania format dla jednego mnożenia wymiarowej (wykazy 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)) 

wynik jest [[5]]