【问题标题】:Math Operation on List of numbers数字列表的数学运算
【发布时间】:2013-05-09 03:59:28
【问题描述】:

我想知道是否可以在数值变量列表之间进行数学运算?例如,我有..

pointA = [ 22, 44, 83 ]
pointB = [ -17, 11, -25 ]

pointC = pointA - pointB
#result: [ 5, 55, 61 ]

或者我应该创建自己的函数?谢谢!

【问题讨论】:

  • 你应该看看numpy库。
  • 您的示例结果是针对 pointA + pointB。

标签: python


【解决方案1】:

安装numpy

>>> import numpy
>>> numpy.add([ 22, 44, 83 ], [ -17, 11, -25 ])
array([ 5, 55, 58])

数组对象大多与列表兼容,但功能更强大。

>>> pointA = numpy.array([ 22, 44, 83 ])
>>> pointB = numpy.array([ -17, 11, -25 ])
>>> pointA + pointB
array([ 5, 55, 58])
>>> pointA * pointB
array([ -374,   484, -2075])
>>> pointA.dot(pointB)
-1965

支持大量其他操作、矩阵和多维数组...

【讨论】:

    【解决方案2】:

    为了得到这个结果,你是在加法而不是减法......无论如何,list comprehensionszip() 会给你你想要的:

    >>> pointA = [22, 44, 83]
    >>> pointB = [-17, 11, -25]
    >>> pointC = [a + b for a, b in zip(pointA, pointB)]
    >>> pointC
    [5, 55, 58]
    

    【讨论】:

    • @squiguy 在这种特殊情况下,我们知道我们只有两个整数要添加,sum() 只是添加了一个不必要的函数调用(并且 IMO 的可读性略低)。
    • 当然,但是如果您有两个以上的列表,您可以使用 zip 中的 * 并将其展开为任意数字。真的没有太大区别。 +1
    【解决方案3】:

    这可以通过map来完成:

    pointC = map(lambda p1, p2: p1 + p2, pointA, pointB)
    

    或者,更简单地说:

    from operators import add
    pointC = map(add, pointA, pointB)
    

    【讨论】:

    • 这很好,很清楚,强调map() 不需要zip(),我们经常看到! (如果传递了额外的可迭代参数,函数必须接受那么多参数并并行应用于所有可迭代的项目。)
    • 如果必须添加两个以上的点,zip() 点和map() 使用sum()(即map(sum, zip(pointA, pointB, pointC, ...))),或者创建一个新的可变参数加法器函数:add_all = lambda *a: sum(a)
    【解决方案4】:

    可能是这样的:

    In [1]: def calculate(p1, p2):
       ...:     return map(sum, zip(p1, p2))
    
    In [2]: pointA = [ 22, 44, 83 ]
       ...: pointB = [ -17, 11, -25 ]
    
    In [3]: calculate(pointA, pointB)
    Out[3]: [5, 55, 58]
    

    【讨论】:

    • operator 模块包含每个 python 运算符的函数。 map() 有一个多参数形式,所以你不需要 zip(): map(operator.add, [ 22, 44, 83 ], [ -17, 11, -25 ]) == [5, 55, 58]
    • @BeniCherniavsky-Paskin - 当然有。但是,我认为在这种情况下,这仍然是一个可行的选择。
    【解决方案5】:

    我一直在用 Python 编写一个可以用于此目的的线性代数模块。它重量轻且易于使用。 add() 方法允许您添加矩阵列表,以防您想要添加两个以上的点。

    在这里查看:https://github.com/jeremynealbrown/mbyn

    A = [
                [8, 3, 4],
                [21, 3, 7],
                [3, 5, 2]
        ]
    
    B = [
                [5, 3, 1], 
                [1, 9, 4],
                [3, 6, 1]
        ]
    
    mbyn.add([A, B])
    
    #output
    #13, 6, 5
    #22, 12, 11
    #6, 11, 3
    

    【讨论】:

    • 无意冒犯,但是与 numpy 这样的健壮、经过测试和调试的库相比,这为 OP 提供了什么优势?如果有,您应该更新您的问题以反映这一点。
    • 未拍摄。我不建议有人用我正在开发的模块替换 numpy。任何访问我的 github 存储库的人都会看到自述文件清楚地表明这是我正在开展的一个项目,作为学习线性代数的一种手段。也就是说,对于这个问题试图解决的简单问题,numpy 可能被认为有点矫枉过正。因此,我在上面示例中使用的简单添加方法中看到了实用程序。
    • Protip #5468 - 不要重新发明轮子。
    • @BurhanKhalid 感谢“Protip”。正如上面提到的和链接的仓库中所指出的:我的目标是学习线性代数,我通过在 Python 中实现简单的代数算法来做到这一点。我不打算重新发明轮子。您甚至阅读过我的回答或以下评论吗?
    • @jeremyne​​albrown,github链接坏了,能更新一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多