2010-10-03 15 views
8

tratando de imitar la función SUMPRODUCT de Excel:suma de productos para múltiples listas en Python

SUMPRODUCT(v1, v2, ..., vN) = 
    v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*vN[n] 

donde n es el número de elementos en cada vector.

Esto es similar al producto de punto, pero para varios vectores. Leí the very detailed discussion del producto de punto regular, pero no sé cómo extenderlo limpiamente a múltiples vectores. Como referencia, estoy copiando el código optimizado propuesto allí, que porté (trivialmente) a Python 3. Por cierto, para producto de punto, el último enfoque aún gana en P3K.

def d0(v1,v2): 
    """                          
    d0 is Nominal approach:                     
    multiply/add in a loop                     
    """ 
    out = 0 
    for k in range(len(v1)): 
     out += v1[k] * v2[k] 
    return out 

def d1(v1,v2): 
    """                          
    d1 uses a map                   
    """ 
    return sum(map(mul,v1,v2)) 

def d3(v1,v2): 
    """                          
    d3 uses a starmap (itertools) to apply the mul operator on an zipped (v1,v2)       
    """ 
    return sum(starmap(mul,zip(v1,v2))) 

Respuesta

16
import operator 

def sumproduct(*lists): 
    return sum(reduce(operator.mul, data) for data in zip(*lists)) 

para Python 3

import operator 
import functools 

def sumproduct(*lists): 
    return sum(functools.reduce(operator.mul, data) for data in zip(*lists)) 
+1

Y si necesito sumproduct para aceptar una lista como argumento, tengo que sustituir 'def sumproduct (* listas)' con 'def sumproduct (listas)' y mantener el 'llamada zip (* listas)' sin cambios. – max

+1

Más corto alt 'def sumproduct (* lists): return sum (map (operador.mul, * listas)) ... pero solo para dos listas, no estoy seguro todavía si podría hacerse más simple de esa manera. – hhh

5

un mapa de la lista para crear una lista de productos, y luego resumir. en un chiste:

suma (mapa (lambda Xi, Yi: Xi Yi *, Listx, Lišty))

3

¿qué pasa con buenos listas por comprensión?

sum([x*y for x,y in zip(*lists)]) 
Cuestiones relacionadas