Wat is de pythonische manier om het puntproduct te berekenen?

Ik heb twee lijsten, de ene heet A, de andere B. Elk element in A is een triple en elk element in B is slechts een getal. Ik zou het resultaat willen berekenen dat is gedefinieerd als:

resultaat = A[0][0] * B[0] + A[1][0] * B[1] + … + A[n-1][0] * B[n-1 ]

Ik weet dat de logica eenvoudig is, maar hoe schrijf je op een pythonische manier?

Bedankt!


Antwoord 1, autoriteit 100%

import numpy
result = numpy.dot( numpy.array(A)[:,0], B)

http://docs.scipy.org/doc/numpy/reference/

Als je het zonder numpy wilt doen, probeer dan

sum( [a[i][0]*b[i] for i in range(len(b))] )

Antwoord 2, autoriteit 93%

Python 3.5 heeft een expliciete operator @voor het puntproduct,
zodat je kunt schrijven

a = A @ B

in plaats van

a = numpy.dot(A,B)

Antwoord 3, autoriteit 65%

Mijn favoriete Pythonic dot-product is:

sum([i*j for (i, j) in zip(list1, list2)])

Dus voor jouw geval kunnen we het volgende doen:

sum([i*j for (i, j) in zip([K[0] for K in A], B)])

Antwoord 4, autoriteit 52%

from operator import mul
sum(map(mul, A, B))

Antwoord 5, autoriteit 10%

De operator en de itertools-modules gebruiken:

from operator import mul
from itertools import imap
sum(imap(mul, A, B))

Antwoord 6, Autoriteit 5%

>>> X = [2,3,5,7,11]
>>> Y = [13,17,19,23,29]
>>> dot = lambda X, Y: sum(map(lambda x, y: x * y, X, Y))
>>> dot(X, Y)
652

en dat is het.


Antwoord 7, Autoriteit 5%

Gebruik more_itertools, een bibliotheek van derden die implementeert De dotproductitertools recept :

import more_itertools as mit
a = [1, 2, 3]
b = [7, 8, 9]
mit.dotproduct(a, b)
# 50

Antwoord 8, Autoriteit 2%

Waarschijnlijk de meest pythonische manier voor dit soort dingen is het gebruik van Numpy . ; -)


Antwoord 9

Dit kan echter worden herhaald, maar:

>>> u = [(1, 2, 3), (4, 5, 6)]
>>> v = [3, 7]

In gewoon Python:

>>> sum([x*y for (x, *x2), y in zip(u,v)])
31

of met behulp van numpy(zoals beschreven in user57368 antwoord):

import numpy as np
>>> np.dot(np.array(u)[:,0], v)
31

Antwoord 10

Alle bovenstaande antwoorden zijn correct, maar naar mijn mening is de meest pythonische manier om het puntproduct te berekenen:

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b)))
32

Antwoord 11

Mensen wijzen de @-operator opnieuw toe als de puntproduct-operator. Hier is mijn code met de zip van vanillepython die een tuple retourneert. Gebruikt dan lijstbegrip in plaats van kaart.

def dot_product(a_vector,b_vector):
    #a1 x b1 + a2 * b2..an*bn return scalar
    return sum([an*bn for an,bn in zip(a_vector,b_vector)])
X = [2,3,5,7,11]
Y = [13,17,19,23,29]
print(dot_product(X,Y)) #652
a=[1,2,3]
b=[4,5,6]
print(dot_product(a,b)) #prints 32= 1*4 + 2*5 + 3*6 = 
a = [1, 2, 3]
b = [7, 8, 9]
print(dot_product(a,b)) #prints 50 

Other episodes