2011-05-07 16 views
20

Tengo dos listas, una se llama A, otra se llama B. Cada elemento en A es un triple, y cada elemento en B es solo un número. Me gustaría calcular el resultado definido como:¿Cuál es la forma pitónica de calcular el producto escalar?

resultado = A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n- 1] [0] * B [n-1]

Sé que la lógica es fácil pero ¿cómo escribir de manera pitónica?

Gracias!

+0

La forma 'A' está estructurado, es una lista 2D/matriz. – igaurav

Respuesta

2

Probablemente la forma más pitonica para este tipo de cosas es usar numpy. ;-)

12

Mi producto favorito Pythonic punto es:

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


Así para su caso, podríamos hacer:

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

Usando el operador y los módulos itertools: solución

from operator import mul 
from itertools import imap 

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

sum(map(mul, A, B)) 
0

Esto podría repetirse, sin embargo:

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

En la llanura Python:

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

O usando numpy (como se describe en la respuesta user57368 's):

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

Python 3.5 tiene un operador explícita @ para el producto escalar, para que pueda escribir

a = A @ B 

en lugar de

a = numpy.dot(A,B) 
0

Todas las respuestas anteriores son correctas, pero en mi opinión las más pitónicas manera de calcular el producto escalar es:

>>> a=[1,2,3] 
>>> b=[4,5,6] 
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b))) 
32 
1
>>> 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 

Y eso es todo.

0

Usando more_itertools, una biblioteca de terceros que implementa el dotproductitertools recipe:

import more_itertools as mit 


a = [1, 2, 3] 
b = [7, 8, 9] 

mit.dotproduct(a, b) 
# 50 
Cuestiones relacionadas