试图模仿Excel的SUMPRODUCT函数:
SUMPRODUCT(v1, v2, ..., vN) =
v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*vN[n]
其中n是每个向量中的元素数。
这类似于点积,但对于多个向量。我读过正规点积的the very detailed discussion,但我不知道如何将它干净地扩展到多个向量。作为参考,我复制了这里提出的优化代码,并将其移植到了Python 3中。顺便说一下,对于点积,最后一种方法仍然在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)))
映射列表以创建产品列表,然后对其求和。
这可以在一行中完成:
好的旧清单理解呢?(正如@Turksarama提到的,这只适用于两个列表)
在Python3.6中测试:
使用列表理解
注意“tuple”理解是slower
使用
map
使用
functools.reduce
对于python 3
相关问题 更多 >
编程相关推荐