【问题标题】:Pythonic way of sum of dot product of two list of lists两个列表的点积之和的Pythonic方式
【发布时间】:2017-12-08 03:50:22
【问题描述】:

如何优雅地做到这一点(Pythonic方式)

您有两个矩阵 A 和 B,每个矩阵都由一个列表表示。

您想计算 A 和 B 的元素乘积矩阵的总和。

示例代码:

sum = 0
nrows = len(A)
ncols = len(A[0])
for i in range(nrows):
    for j in range(ncols):
        sum += A[i][j]*B[i][j]

# interested finally in the value of sum
# return sum

例如如果

A=[[1,2,3],[3,4,5]]

B=[[3,2,2],[1,1,1]]

结果是:

1*3 + 2*2 + 3*2 + 3*1 + 4*1 + 5*1 = 25

【问题讨论】:

  • 这和一般情况下两个矩阵的点积是不一样的。
  • sum()reduce()zip() 将每个矩阵展平成对,将每对与sum() 结果相乘。可能是一个单一的班轮,但它不会是美丽的。
  • 没错,它和两个矩阵的点积不一样,但是我不知道这个运算应该叫什么,我虽然点积表达了意思。

标签: python list product


【解决方案1】:

如果矩阵总是二维的,你可以这样做

sum(sum(a * b for a, b in zip(*rows)) for rows in zip(A, B))

IDEOne Link

【讨论】:

  • 这很棒。正是我想要的纯 Python 方式。
【解决方案2】:

您也可以尝试这样的事情(假设矩阵是二维的):

import itertools

A=[[1,2,3],[3,4,5]]
B=[[3,2,2],[1,1,1]]

def flatten(lst):
    return itertools.chain.from_iterable(lst)

>>> print(sum(x * y for x, y in zip(flatten(A), flatten(B))))
25

甚至:

>>> print(sum(x * y for x, y in zip(sum(A, []), sum(B, []))))
25

【讨论】:

  • 第二种方法很漂亮,关于你如何压平它。它实际上在时间上优于上面“疯狂物理学家”给出的另一种方法。
  • @user1780424 是的,很高兴你喜欢它。如果您的列表非常大,第一种方法将优于其他方法,请查看第 4 个答案here。使用itertools.chain.from_iterable 扁平化列表非常有效。
【解决方案3】:

这是@MadPhysicist 的生成器表达式的平面版本。

sum(a*b for ab in zip(A, B) for a, b in zip(*ab))
# 25

【讨论】:

    【解决方案4】:
    import itertools
    
    A = [[1,2,3],[3,4,5]]
    B = [[3,2,2],[1,1,1]]
    
    # flatten list A => [1,2,3,3,4,5]]
    A_flat = itertools.chain.from_iterable(A)
    
    # flatten list B = > [3,2,2,1,1,1]]
    B_flat = itertools.chain.from_iterable(B)
    
    # making sum of 1+3 , 2+2 , 3+2 result=> [4, 4, 5, 4, 5, 6]
    pair_sum = [ sum(pair) for pair in zip(A_flat,B_flat)]
    
    # total
    print('Total : ', sum(pair_sum))
    
    
    ############
    
    import itertools
    
    A = [[1,2,3],[3,4,5]]
    B = [[3,2,2],[1,1,1]]
    A_flat = itertools.chain.from_iterable(A)
    B_flat = itertools.chain.from_iterable(B)
    total = sum(sum(pair) for pair in zip(A_flat,B_flat))
    print(total)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多