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