【问题标题】:Python dot-multiply lists on list of lists, without using numpy列表列表上的Python点乘列表,不使用numpy
【发布时间】:2014-03-27 21:18:40
【问题描述】:

我对 python 还是很陌生,因此我对数组很感兴趣,我对一个相当简单的问题感到震惊。我有一个列表,如下所示:

a = [[1,0,1,0,1],[0,0,1,0,1],[0,0,1,0,1],[1,1,1,0,1],[1,0,0,0,0]]

我想将每个列表的元素相乘。比如:

a_dot = [1,0,1,0,1]*[0,0,1,0,1]*[0,0,1,0,1]*[1,1,1,0,1]*[1,0,1,0,0]
=[0,0,1,0,0]

想知道我是否可以不使用使用 numpy/scipy。

谢谢。

【问题讨论】:

  • 你的值总是0和1吗?因为这将允许使用快捷方式,所以如果 items 中有任何 0,则结​​果中的元素为 0
  • 在这种情况下,是的,我只处理 0 和 1 - 但是,我想要这个乘法的通用解决方案。
  • @AJW:整数还是实数?

标签: python computation dot-product mathematical-expressions


【解决方案1】:
import operator
a_dot = [reduce(operator.mul, col, 1) for col in zip(*a)]

但如果你所有的数据都是 0 和 1:

a_dot = [all(col) for col in zip(*a)]

【讨论】:

  • 以前从未听说过operator。这个col, 1在这里做什么?
  • 可以解释一下; zip(*rows) 转置矩阵,它们向reduce 提供什么参数。
  • operator.mul 只是lambda a, b: a * b 的简写。查看 reduce 的文档
  • 感谢 Eric - 您的解决方案非常优雅。感谢您向我介绍operatorreduce。接受你的回答。
  • @tobias_k:你的解决方案是什么?
【解决方案2】:

你试过reduce函数吗?您使用一个函数(将其视为您的运算符)和一个列表来调用它,它会按照您描述的方式应用它。

【讨论】:

    【解决方案3】:

    你可以通过下面的代码来解决,

    def multiply(list_a,list_b):
        c = []
        for x,y in zip(list_a,list_b):
            c.append(x*y)
        return c
    
    reduce(lambda list_a,list_b: multiply(list_a,list_b), a)
    

    编码愉快!!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多