在Python中添加简洁的矢量?

Joh*_*ski 37 python

我经常添加Python列表的向量.

示例:我有两个这样的列表:

a = [0.0, 1.0, 2.0]
b = [3.0, 4.0, 5.0]
Run Code Online (Sandbox Code Playgroud)

我现在想要将a添加到a以获得结果a = [3.0, 5.0, 7.0].

通常我最终这样做:

a[0] += b[0]
a[1] += b[1]
a[2] += b[2]
Run Code Online (Sandbox Code Playgroud)

是否有一些有效,标准的方法来减少打字?

更新:可以假设列表长度为3并包含浮点数.

gim*_*mel 38

如果您需要高效的矢量运算,请尝试Numpy.

>>> import numpy
>>> a=numpy.array([0,1,2])
>>> b=numpy.array([3,4,5])
>>> a+b
array([3, 5, 7])
>>> 
Run Code Online (Sandbox Code Playgroud)

或者(谢谢Andrew Jaffe),

>>> a += b
>>> a
array([3, 5, 7])
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 看起来是一种节省输入的好方法,但我不喜欢它添加了依赖项并且比原始代码慢了三倍。 (2认同)

bes*_*sen 36

我认为你不会找到比问题中提出的3个总和更快的解决方案.使用较大的向量可以看到numpy的优点,如果需要其他运算符,也可以看到numpy的优点.numpy对于矩阵特别有用,女巫是python列表的技巧.

不过,还有另一种方法:D

In [1]: a = [1,2,3]

In [2]: b = [2,3,4]

In [3]: map(sum, zip(a,b))
Out[3]: [3, 5, 7]
Run Code Online (Sandbox Code Playgroud)

编辑:你也可以使用itertools的izip,它是zip的生成器版本

In [5]: from itertools import izip

In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]
Run Code Online (Sandbox Code Playgroud)

  • 有趣的事实:`map`附带`zip'功能.这允许说`map(operator.add,a,b)` (3认同)

Ale*_*lli 33

虽然数字非常好,而列表理解解决方案如果你真的想要创建一个新列表,我很惊讶没有人建议"一个明显的方法来做到这一点" - 一个简单的for循环!最好:

for i, bi in enumerate(b): a[i] += bi
Run Code Online (Sandbox Code Playgroud)

还好,有点排序:

for i in xrange(len(a)): a[i] += b[i]
Run Code Online (Sandbox Code Playgroud)


Geo*_*lly 19

如果您认为Numpy过度,那么这应该非常快,因为此代码在纯C中运行(map()并且__add__()都直接在C中实现):

a = [1.0,2.0,3.0]
b = [4.0,5.0,6.0]

c = map(float.__add__, a, b)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不知道列表中的类型:

import operator
c = map(operator.add, a, b)
Run Code Online (Sandbox Code Playgroud)

  • 看一下操作员模块.你可以使用`operator.add`. (3认同)

Ric*_*dle 12

这个怎么样:

a = [x+y for x,y in zip(a,b)]
Run Code Online (Sandbox Code Playgroud)

  • 谁在乎3?你怎么键入100项? (3认同)
  • +1但这只适用于列表大小相同的情况.izip_longest的zip值为0,如果它们的大小不一样 (2认同)
  • 好吧,如果你想知道如何总和两个长度三对列表然后你应该明确说明.你的方法可能是最快的,但你的问题太局部化了. (2认同)

And*_*ffe 7

或者,如果您愿意使用外部库(和固定长度数组),请使用numpy,它具有"+ ="和相关操作以进行就地操作.

import numpy as np
a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
a += b
Run Code Online (Sandbox Code Playgroud)