我只是想知道是否有一种特别pythonic方式添加两个元组elementwise?元素添加两个元组
到目前为止(a和b元组),我有
map(sum, zip(a, b))
我的预期输出是:
(a[0] + b[0], a[1] + b[1], ...)
和可能的体重将是给一个0.5的重量和b 0.5体重,等等。 (我试图采取加权平均)。
哪个工作正常,但说我想添加一个权重,我不太确定我该怎么做。
谢谢
我只是想知道是否有一种特别pythonic方式添加两个元组elementwise?元素添加两个元组
到目前为止(a和b元组),我有
map(sum, zip(a, b))
我的预期输出是:
(a[0] + b[0], a[1] + b[1], ...)
和可能的体重将是给一个0.5的重量和b 0.5体重,等等。 (我试图采取加权平均)。
哪个工作正常,但说我想添加一个权重,我不太确定我该怎么做。
谢谢
拉他们,然后求和每个元组。
[sum(x) for x in zip(a,b)]
编辑:这里有一个更好的,虽然更复杂的版本,它允许进行加权。
from itertools import starmap, islice, izip
a = [1, 2, 3]
b = [3, 4, 5]
w = [0.5, 1.5] # weights => a*0.5 + b*1.5
products = [m for m in starmap(lambda i,j:i*j, [y for x in zip(a,b) for y in zip(x,w)])]
sums = [sum(x) for x in izip(*[islice(products, i, None, 2) for i in range(2)])]
print sums # should be [5.0, 7.0, 9.0]
>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> def averageWeightedSum(args):
return sum(args)/len(args)
>>> tuple(map(averageWeightedSum, zip(a, b)))
(2.5, 3.5, 4.5)
另一种方法是首先应用的权重。这也将让你有不同的权重:
>>> from operator import mul
>>> weights = (0.3, 0.7)
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b))
(3.0999999999999996, 4.1, 5.1)
>>> weights = (0.5, 0.5)
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b))
(2.5, 3.5, 4.5)
就拿公式一对坐标的加权和,并与每对(注意for
后两个变量)是迭代器的元组:
tuple(0.5*an + 0.5*bn for an, bn in zip(a, b))
这可以使它简单易读并且可以作为一行代码。当然,如果你的“加权和”是一个复杂的函数,你可以先将它定义为一个单独的函数。
'元组(zip(a,b)中x的和(x))** **更好......和**'元组(map(sum,zip(a,b)))' ** even even更好**。 – Nawaz 2016-04-26 08:53:02
@Nawaz,为什么它更好?我说i'sum()'更糟。如果你想要一个加权和,'sum()'是没用的。此外,这是一个有趣的问题,但我发现'sum()'更适合于有无限数量的加数时 - 这里总是添加两个词。我猜想,对于他们自己,但不要忘记,加权总和是OP问题的一部分。 – alexis 2016-04-26 14:50:45
哦..我没有注意到重量。但是,第一种形式仍然可以作为:'tuple(0.5 * sum(x)for zip in(a,b))'。它几乎与你的一样,只是它更实用(也可能是pythonic)。 – Nawaz 2016-04-26 15:07:43
如果你不介意的依赖,可以在阵列
使用numpy的进行的elementwise操作>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([3, 4, 5])
>>> a + b
array([4, 6, 8])
如果你的元组包含str
对象:
list(map(''.join, zip('abc', '123')))
# Returns ['a1', 'b2', 'c3']
什么是你期望的输出呢? – msvalkon 2013-05-14 16:46:36
你*是*明智地处理你的'a'和'b'元组元素。你也可以在'zip(a,b)'中使用'tuple(sum(aa,bb)for aa,bb)'将这两个元素解压到单独的变量中。你的加权公式是什么? – 2013-05-14 16:46:37
而不仅仅是'sum(i)'(或'sum(aa,bb)'),您可以使用* * *表达式来创建其他元素。包括一个包含总和和其他值的元组:'(sum(aa,bb),aa/bb)'。 – 2013-05-14 16:47:56