2013-05-14 19 views
5

Tôi đã tự hỏi liệu có cách nào đặc biệt là bổ sung thêm hai bộ dữ liệu không?Thêm hai bộ dữ liệu theo nguyên tố

Cho đến nay (a và b là các tuple), tôi có

map(sum, zip(a, b)) 

sản lượng dự kiến ​​của tôi sẽ là:

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

Và một thể nặng sẽ được cung cấp cho một trọng lượng 0,5 và b 0,5 trọng lượng, hoặc như vậy. (Tôi đang cố gắng để có một trọng số trung bình).

Làm việc tốt, nhưng nói rằng tôi muốn thêm trọng số, tôi không hoàn toàn chắc chắn như thế nào tôi sẽ làm điều đó.

Cảm ơn

+0

kết quả mong muốn của bạn là gì sau đó? – msvalkon

+1

Bạn * đang xử lý phần tử 'a' và' b' tuples một cách khôn ngoan. Bạn cũng có thể làm 'tuple (tổng (aa, bb) cho aa, bb trong zip (a, b))' để giải nén hai phần tử thành các biến riêng biệt. Công thức trọng lượng của bạn sẽ là gì? –

+0

Và thay vì chỉ 'tổng (i)' (hoặc 'tổng hợp (aa, bb)' cho vấn đề đó), bạn có thể sử dụng biểu thức * khác * để tạo các phần tử khác. Bao gồm một bộ tuple có cả giá trị tổng và các giá trị khác: ví dụ: '(tổng (aa, bb), aa/bb)'. –

Trả lời

13

Nén chúng, sau đó tính tổng mỗi bộ.

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

EDIT: Dưới đây là một tốt hơn, mặc dù phiên bản phức tạp hơn cho phép trọng.

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

Đây không phải là những gì anh ta có danh sách mẫu? – squiguy

+0

không, bởi vì anh * có thể * thay thế "tổng hợp" bằng .8 * x [0] + .2 * x [1] – Crisfole

+0

@ChristopherPfohl Vâng chắc chắn, nhưng tôi nghĩ rằng đã được ghi nhận trong các ý kiến. – squiguy

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) 

Một thay thế sẽ được áp dụng trọng số đầu tiên. Điều này cũng sẽ cho phép bạn có trọng lượng khác nhau:

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

Đi công thức cho tổng trọng số của một cặp tọa độ, và tạo thành một tuple với một iterator trên mỗi cặp (chú ý hai biến sau khi for):

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

Điều này giúp đơn giản và dễ đọc như một lớp lót. Tất nhiên nếu "tổng trọng số" của bạn là một hàm phức tạp, trước tiên bạn phải định nghĩa nó như một hàm riêng biệt.

+0

'tuple (tổng (x) cho x trong zip (a, b))' ** là tốt hơn ... và ** 'tuple (bản đồ (tổng, zip (a, b)))' ** thậm chí là tốt hơn**. – Nawaz

+0

@Nawaz, tại sao nó tốt hơn? Tôi nói i'sum() 'là tồi tệ hơn. Nếu bạn muốn một tổng trọng số, 'sum()' là vô dụng. Ngoài ra, nó là một vấn đề của hương vị nhưng tôi tìm thấy 'sum()' thích hợp hơn khi có một số lượng vô hạn của các summands - ở đây nó luôn luôn là hai thuật ngữ được thêm vào. Với mỗi người, tôi đoán, nhưng đừng quên rằng tổng trọng số là một phần của câu hỏi của OP. – alexis

+0

Ohh .. Tôi không nhận thấy trọng lượng. Nhưng sau đó dạng đầu tiên vẫn có thể hoạt động như: 'tuple (0,5 * sum (x) cho x trong zip (a, b))'. Nó gần giống như của bạn, chỉ là nó có chức năng hơn (và có lẽ cả pythonic nữa). – Nawaz

2

Nếu bạn không nhớ sự phụ thuộc, bạn có thể sử dụng cho các hoạt động NumPy elementwise trên mảng

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

Nếu tuples của bạn có chứa str đối tượng:

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