【问题标题】:Python SUMPRODUCT of elements in nested list嵌套列表中元素的Python SUMPRODUCT
【发布时间】:2017-09-25 04:37:36
【问题描述】:

我有两个嵌套列表:

a = [[1,2,3],[2,4,2]]
b = [[5,5,5],[1,1,1]]

我想将每组元素相乘并求和得到

c = [[30],[8]]

= [[1*2+2*5+3*5],[2*1,4*1,2*1]] 的结果

我试过这样做:

c = sum(x * y for x, y in zip(a, b))

但我得到“不能将序列乘以 'list' 类型的非整数”

是否有一种简单的列表理解方式来避免 for 循环?

【问题讨论】:

  • 您应该首先尝试使用 for 循环编写它并添加一些 prints 以​​了解发生了什么。当你理解了它,你可以用更简洁的方式重写它。
  • 嗯... 1*2+2*5+3*5 = 30 怎么算?运算顺序是“先乘再加”,所以应该是 2+10+15=27,对吧?
  • 看起来您正在尝试进行矩阵乘法。如果是这样,您可能只想开始在numpy 中使用多维数组。
  • 您的意思可能是 1*5 作为第一个,对吧?这将是......哪个结果来自 = [[1*5+2*5+3*5],[2*1,4*1,2*1]]

标签: python


【解决方案1】:

你可以实现dotproductitertools recipes

import operator


def dotproduct(vec1, vec2):
    return sum(map(operator.mul, vec1, vec2))

代码

a = [[1,2,3], [2,4,2]] 
b = [[5,5,5], [1,1,1]]

[[dotproduct(x, y)] for x, y in zip(a, b)]
# [[30], [8]]

【讨论】:

    【解决方案2】:

    没有 numpy

    具有列表理解的解决方案,也许会这样:

    a = [[1,2,3],[2,4,2]]
    b = [[5,5,5],[1,1,1]]
    
    c = [[sum(map(lambda m: reduce(lambda h,i: h * i, m), n))] for n in [zip(x, y) for x, y in zip(a, b)]]
    

    然后给我看:

    [[30], [8]] 
    

    另一个更干净的解决方案是一个简单的 for 循环

    a = [[1,2,3],[2,4,2]]
    b = [[5,5,5],[1,1,1]]
    
    c = []
    
    for x, y in zip(a, b):
        temp = []
        for m, n in zip(x,y):
            temp.append(m * n)
        c.append([sum(temp)])
    

    结果:

    [[30], [8]]
    

    抱歉变量名不可读,在这种情况下我推荐简单的for

    【讨论】:

      【解决方案3】:

      Numpy 解决方案

      import numpy as np
      
      c = map(lambda x: sum(np.prod((np.array(x)), axis=0)), zip(a,b))
      
      [30, 8]
      

      如果你需要产生[[30], [8]]那么

      c = map(lambda x: [sum(np.prod((np.array(x)), axis=0))], zip(a,b))
      

      【讨论】:

      • 这不是我们想要的结果。如果是,你也可以(np.array(a) * b).sum(1).tolist(),不是吗? (我不确定。我是个麻木的菜鸟)
      • 要获得确切的结果,您必须重塑数组。 (np.array(a)*np.array(b)).sum(1).reshape((2,1)).tolist()
      • 或者你可以在sum函数周围加上括号,它会产生[[30], [8]]
      【解决方案4】:

      您可以使用嵌套列表推导来做到这一点,但这会很复杂。这是一步一步。

      a = [[1,2,3],[2,4,2]]
      b = [[5,5,5],[1,1,1]]
      result1 = [[x*y for x, y in zip(r1, r2)] for r1, r2 in zip(a, b)]
      c = [[sum(r)] for r in result1]
      
      c
      [[30], [8]]
      

      【讨论】:

      • 您的代码与您的文本不一致,这是一个嵌套列表理解。
      • 已更正。谢谢@Stefan。
      • 好点@Stefan。如果没有嵌套,我不知道该怎么做!
      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2022-01-06
      • 2021-10-29
      相关资源
      最近更新 更多