在Python中添加简洁的矢量?

时间:2009-05-10 11:05:59

标签: python

我经常添加Python列表。

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

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

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

通常我最终会这样做:

a[0] += b[0]
a[1] += b[1]
a[2] += b[2]

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

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

13 个答案:

答案 0 :(得分:36)

如果您需要有效的矢量运算,请尝试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])
>>> 

答案 1 :(得分:33)

我认为你不会找到比问题中提出的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]

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

In [5]: from itertools import izip

In [6]: map(sum, izip(a,b))
Out[6]: [3, 5, 7]

答案 2 :(得分:31)

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

for i, bi in enumerate(b): a[i] += bi

还行,有点候选:

for i in xrange(len(a)): a[i] += b[i]

答案 3 :(得分:17)

如果您认为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)

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

import operator
c = map(operator.add, a, b)

答案 4 :(得分:11)

这个怎么样:

a = [x+y for x,y in zip(a,b)]

答案 5 :(得分:6)

或者,如果您愿意使用外部库(以及固定长度数组),请使用numpy,其中包含“+ =”和相关操作以进行就地操作。

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

答案 6 :(得分:3)

[a [x] + b [x] for x in range(0,len(a))]

答案 7 :(得分:2)

对于拥有列表列表的一般情况,您可以执行以下操作:

In [2]: import numpy as np

In [3]: a = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3],[4, 5, 6]])

In [4]: [sum(a[:,i]) for i in xrange(len(a[0]))]
Out[4]: [10, 11, 12]

答案 8 :(得分:1)

如果你简明扼要,试试......

vectors = [[0.0, 1.0, 2.0],[3.0, 4.0, 5.0]]
[sum(col) for col in zip(*vectors)]

虽然我不能代表这一点的表现。

答案 9 :(得分:1)

list(map(lambda x:x[0]+x[1], zip(a,b)))

答案 10 :(得分:0)

你可以创建一个函数来获取数组的大小,循环遍历它并创建一个它返回的返回数组。

答案 11 :(得分:0)

理解列表的改进(减少内存消耗)

导入itertools a = [x + y代表x,y代表itertools.izip(a,b)]

实际上如果你不确定a会消耗掉那么我甚至会选择生成器表达式:

(x + y代表x,y代表itertools.izip(a,b))

答案 12 :(得分:0)

a = map(lambda x, y: x + y, a, b)