Python中简洁的向量相加方法?
我经常需要对Python列表进行向量加法。
举个例子:我有两个这样的列表:
a = [0.0, 1.0, 2.0]
b = [3.0, 4.0, 5.0]
现在我想把b加到a上,得到的结果是 a = [3.0, 5.0, 7.0]
。
通常我都是这样做的:
a[0] += b[0]
a[1] += b[1]
a[2] += b[2]
有没有什么更简单、更标准的方法可以减少输入的内容呢?
更新:可以假设这些列表的长度是3,并且里面的数都是浮点数。
13 个回答
35
虽然使用Numeric库很不错,列表推导式的解决方案也还可以,如果你真的想创建一个新列表的话,但我很惊讶没有人提到“最明显的做法”——就是用一个简单的 for
循环!最好的方法是:
for i, bi in enumerate(b): a[i] += bi
另外,这种方法也可以,勉强算是可行:
for i in xrange(len(a)): a[i] += b[i]
52
如果你需要高效的向量运算,可以试试Numpy这个库。
>>> import numpy
>>> a=numpy.array([0,1,2])
>>> b=numpy.array([3,4,5])
>>> a+b
array([3, 5, 7])
>>>
或者(感谢Andrew Jaffe),
>>> a += b
>>> a
array([3, 5, 7])
>>>
50
我觉得你找不到比问题中提到的三种方法更快的解决方案。使用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]
补充: 你还可以使用itertools中的izip,它是zip的生成器版本。
In [5]: from itertools import izip
In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]