2013-05-14 88 views
5

我只是想知道是否有一種特別pythonic方式添加兩個元組elementwise?元素添加兩個元組

到目前爲止(a和b元組),我有

map(sum, zip(a, b)) 

我的預期輸出是:

(a[0] + b[0], a[1] + b[1], ...) 

和可能的體重將是給一個0.5的重量和b 0.5體重,等等。 (我試圖採取加權平均)。

哪個工作正常,但說我想添加一個權重,我不太確定我該怎麼做。

謝謝

+0

什麼是你期望的輸出呢? – msvalkon 2013-05-14 16:46:36

+1

你*是*明智地處理你的'a'和'b'元組元素。你也可以在'zip(a,b)'中使用'tuple(sum(aa,bb)for aa,bb)'將這兩個元素解壓到單獨的變量中。你的加權公式是什麼? – 2013-05-14 16:46:37

+0

而不僅僅是'sum(i)'(或'sum(aa,bb)'),您可以使用* * *表達式來創建其他元素。包括一個包含總和和其他值的元組:'(sum(aa,bb),aa/bb)'。 – 2013-05-14 16:47:56

回答

13

拉他們,然後求和每個元組。

[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] 
+0

這不是他剛纔的列表形式? – squiguy 2013-05-14 17:03:28

+0

不可以,因爲他*可以*替換「和」.8 * x [0] + .2 * x [1] – Crisfole 2013-05-14 17:11:00

+0

@ChristopherPfohl當然可以,但我認爲這是在評論中提到的。 – squiguy 2013-05-14 17:12:34

4
>>> 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) 
2

就拿公式一對座標的加權和,並與每對(注意for後兩個變量)是迭代器的元組:

tuple(0.5*an + 0.5*bn for an, bn in zip(a, b)) 

這可以使它簡單易讀並且可以作爲一行代碼。當然,如果你的「加權和」是一個複雜的函數,你可以先將它定義爲一個單獨的函數。

+0

'元組(zip(a,b)中x的和(x))** **更好......和**'元組(map(sum,zip(a,b)))' ** even even更好**。 – Nawaz 2016-04-26 08:53:02

+0

@Nawaz,爲什麼它更好?我說i'sum()'更糟。如果你想要一個加權和,'sum()'是沒用的。此外,這是一個有趣的問題,但我發現'sum()'更適合於有無限數量的加數時 - 這裏總是添加兩個詞。我猜想,對於他們自己,但不要忘記,加權總和是OP問題的一部分。 – alexis 2016-04-26 14:50:45

+0

哦..我沒有注意到重量。但是,第一種形式仍然可以作爲:'tuple(0.5 * sum(x)for zip in(a,b))'。它幾乎與你的一樣,只是它更實用(也可能是pythonic)。 – Nawaz 2016-04-26 15:07:43

2

如果你不介意的依賴,可以在陣列

使用numpy的進行的elementwise操作
>>> import numpy as np 
>>> a = np.array([1, 2, 3]) 
>>> b = np.array([3, 4, 5]) 
>>> a + b 
array([4, 6, 8]) 
0

如果你的元組包含str對象:

list(map(''.join, zip('abc', '123'))) 
# Returns ['a1', 'b2', 'c3']