Python 3: Înmulțirea unui vector cu o matrice fără NumPy (Programare, Python, Python 3.X, Numpy, Matrix, Vector)

JGraham353 a intrebat.

Sunt destul de nou în Python și încerc să creez o funcție pentru a înmulți un vector cu o matrice (de orice dimensiune a coloanelor). de ex:

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

[1, 1]

Aici este codul meu:

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  

Problema este că atunci când încerc să selectez primul rând al fiecărei coloane din matrice (r[j]) apare eroarea „list index out of range”. Există o altă modalitate de a finaliza înmulțirea fără a utiliza NumPy?

6 răspunsuri
Kasravnd

Abordarea Numpythonic: (folosind numpy.dot pentru a obține produsul punct al două 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])

Abordarea pythonică:

Lungimea celei de-a doua for bucla este len(v) și încercați să indexați v pe baza acesteia, astfel încât să obțineți index Error . Ca o metodă mai pythonică, puteți folosi zip pentru a obține coloanele unei liste și apoi să folosiți funcția starmap și mul în cadrul înțelegerii unei liste:

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]

Comentarii

  • Acest lucru nu pare a fi potrivit pentru un începător. –  > Por physicalattraction.
  • @physicalattraction voi adăuga mai multe descrieri 😉 –  > Por Kasravnd.
  • Mulțumesc. Nu dădusem peste funcția zip – ușurează foarte mult lucrurile! Un ultim lucru, primesc o eroare de sintaxă atunci când încerc să returnez suma(mul(k,t)). Sunt evidențiate parantezele pătrate exterioare, care presupun că returnează suma ca o listă? –  > Por JGraham353.
  • @Liam_S bine ai venit , deci ce zici de acceptarea răspunsului meu ? 😉 –  > Por Kasravnd.
stackPusher

Cred că problema cu codul tău a fost că faci o buclă prin rândurile matricei, mai degrabă decât prin coloane. De asemenea, nu resetezi variabila „total” după fiecare calcul vector*coloană a matricei. Aceasta este ceea ce doriți:

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

Simeon Visser

r este un element din G deci este un rând care are doar două elemente. Asta înseamnă că nu puteți folosi indexul j pentru a obține o valoare din r deoarece j merge de la 0 până la lungimea elementului v, , care este 6 în exemplul dvs.

ChrisFreeman

Aveam nevoie de o soluție în care prima matrice să fie bidimensională. Extinderea soluției de la @Kasramvd pentru a accepta o matrice bidimensională first dimensională. Postat aici pentru referință:

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

Pradeep Padmanaban C

am atașat un cod pentru înmulțirea matricelor urmați formatul exemplului pentru înmulțirea unidimensională (liste de liste)

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

rezultatul este [[5]]

Ilyas Maamri

Există un cod care vă ajută să înmulțiți două matrice:

A=[[1,2,3],[4,5,6],[7,8,9]]
B=[[1,2,3],[4,5,6],[7,8,9]]
matrix=[]

def multiplicationLineColumn(line,column):
    try:
        sizeLine=len(line)
        sizeColumn=len(column)
        if(sizeLine!=sizeColumn):
            raise ValueError("Exception")
        res = sum([line[i] * column[i] for i in range(sizeLine)])
        return res
    except ValueError:
        print("sould have the same len line & column")

def  getColumn(matrix,numColumn):
    size=len(matrix)
    column= [matrix[i][numColumn] for i in range(size)]
    return column

def getLine(matrix,numLine):
    line = matrix[numLine]
    return line

for i in range(len(A)):
    matrix.append([])
    for j in range(len(B)):
        matrix[i].append(multiplicationLineColumn(getLine(A,i),getColumn(B,j)))

print(matrix)

Comentarii

  • Ați putea explica de ce răspunsul dvs. este mai bun decât celelalte postate. –  > Por user_3pij.
  • @user_3pij nu este mai bun decât alții, dar acesta este un cod nativ care nu folosește numpy Am vrut să arăt că putem face aceeași sarcină doar prin elementele de bază python –  > Por Ilyas Maamri.