Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sum of products for multiple lists in python

Trying to imitate Excel's SUMPRODUCT function:

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

where n is the number of elements in each vector.

This is similar to dot product, but for multiple vectors. I read the very detailed discussion of the regular dot product, but I don't know how to cleanly extend it to multiple vectors. For reference, I'm copying the optimized code proposed there, which I ported (trivially) to Python 3. BTW, for dot product, the last approach still wins in 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)))
like image 400
max Avatar asked Oct 03 '10 09:10

max


1 Answers

Map the list to create a list of products, and then sum it.

This can be done in one line:

sum(map(lambda Xi, Yi: Xi * Yi, ListX, ListY))
like image 148
user2352238 Avatar answered Sep 20 '22 19:09

user2352238