Añadiendo dos tuplas elementwise

Me preguntaba si había una manera especialmente pythonica de agregar dos tuplas de forma elemental.

Hasta ahora (ayb son tuplas), tengo

map(sum, zip(a, b)) 

Mi salida esperada sería:

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

Y un posible pesaje sería dar un peso de 0.5 y b de 0.5, o así sucesivamente. (Estoy tratando de tomar un promedio ponderado).

Lo cual funciona bien, pero digo que quería agregar una ponderación, no estoy seguro de cómo haría eso.

Gracias

Zip ellos, luego sumr cada tupla.

 [sum(x) for x in zip(a,b)] 

EDITAR: Aquí hay una versión mejor, aunque más compleja, que permite la ponderación.

 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) 

Una alternativa sería aplicar los pesos primero. Esto también te permitiría tener diferentes pesos:

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

Si no le importa la dependencia, puede usar numpy para operaciones elementwise en arreglos

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

Tome la fórmula para la sum ponderada de un par de coordenadas y forme una tupla con un iterador sobre cada par (observe las dos variables después de la for ):

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

Esto lo mantiene simple y legible como una sola línea. Por supuesto, si su “sum ponderada” es una función complicada, primero la definiría como una función separada.

Si tus tuplas contienen objetos str :

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