Python 中两个列表的点积
Dot product of two lists in Python
我需要编写函数 dot( L, K ) 来输出列表 L 和 K 的点积。如果这两个输入列表的长度不相等,则 dot 应该输出 0。如果这两个列表都是空的,点也应该输出 0。你应该假设输入列表只包含数值。
这是我目前拥有的:
def dot( L, K ):
if len[L]!=len[K]:
return 0
elif L == '' or L == []:
return 0
else:
return sum(L[0]*K[0], L[1]*K[1], ect.)
谁能帮帮我,因为我不知道最后一行要做什么!
您可以使用列表理解来做到这一点:
def dot(K, L):
if len(K) != len(L):
return 0
return sum(i[0] * i[1] for i in zip(K, L))
如果其中一个列表为空,zip(K, L)
将 return []
。然后,根据定义,sum([])
将为您提供零。
for 循环 returns 每个 K*L 元素相乘的数组。
然后 sum 函数添加每个元素和 returns 点积
def dot(K,L):
if len(K)==len(L) and len(K)!=0:
return sum([K[n]*L[n] for n in range(len(K))])
else:
return 0
一个适用于任意大小向量的衬里(您可能希望将其定义为更规则和可读的函数或更改代码以使用 sum
而不是最左边的 reduce
)。它不定义非等长的乘法,因为它不是标准点积定义的一部分——它只会报告非等长的错误:
dotprod =lambda K, L:reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L)))
快速测试:
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[39]: 70
5+12+21+32
Out[40]: 70
如果您仍希望合并长度检查和非等于乘法的定义:
dotprod =lambda K, L: reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L))) if len(K)==len(L) else 0
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[43]: 70
dotprod([1, 2, 3, 4], [5, 6, 7])
Out[44]: 0
使用列表理解,给定 V1 和 V2 是两个向量(列表):
sum([x*y for x,y in zip(V1,V2)])
vector_a = [1., 2., 3.]
vector_b = [2., 2., 2.]
z=list(zip(vector_a,vector_b))
a=sum([x*y for x,y in zip(vector_a,vector_b)])
for m,n in z:
print(str(m)+"*",str(n))
print(a)
#hope you got it `
使用 Zip 函数可以降低复杂性,使其在点积或任何多列表操作的情况下使用起来更加高效。
我需要编写函数 dot( L, K ) 来输出列表 L 和 K 的点积。如果这两个输入列表的长度不相等,则 dot 应该输出 0。如果这两个列表都是空的,点也应该输出 0。你应该假设输入列表只包含数值。
这是我目前拥有的:
def dot( L, K ):
if len[L]!=len[K]:
return 0
elif L == '' or L == []:
return 0
else:
return sum(L[0]*K[0], L[1]*K[1], ect.)
谁能帮帮我,因为我不知道最后一行要做什么!
您可以使用列表理解来做到这一点:
def dot(K, L):
if len(K) != len(L):
return 0
return sum(i[0] * i[1] for i in zip(K, L))
如果其中一个列表为空,zip(K, L)
将 return []
。然后,根据定义,sum([])
将为您提供零。
for 循环 returns 每个 K*L 元素相乘的数组。 然后 sum 函数添加每个元素和 returns 点积
def dot(K,L):
if len(K)==len(L) and len(K)!=0:
return sum([K[n]*L[n] for n in range(len(K))])
else:
return 0
一个适用于任意大小向量的衬里(您可能希望将其定义为更规则和可读的函数或更改代码以使用 sum
而不是最左边的 reduce
)。它不定义非等长的乘法,因为它不是标准点积定义的一部分——它只会报告非等长的错误:
dotprod =lambda K, L:reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L)))
快速测试:
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[39]: 70
5+12+21+32
Out[40]: 70
如果您仍希望合并长度检查和非等于乘法的定义:
dotprod =lambda K, L: reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L))) if len(K)==len(L) else 0
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[43]: 70
dotprod([1, 2, 3, 4], [5, 6, 7])
Out[44]: 0
使用列表理解,给定 V1 和 V2 是两个向量(列表):
sum([x*y for x,y in zip(V1,V2)])
vector_a = [1., 2., 3.]
vector_b = [2., 2., 2.]
z=list(zip(vector_a,vector_b))
a=sum([x*y for x,y in zip(vector_a,vector_b)])
for m,n in z:
print(str(m)+"*",str(n))
print(a)
#hope you got it `
使用 Zip 函数可以降低复杂性,使其在点积或任何多列表操作的情况下使用起来更加高效。