2011-05-07 36 views
20

Tôi có hai danh sách, một danh sách được đặt tên là A, một danh sách khác có tên là B. Mỗi phần tử trong A là một ba và mỗi phần tử trong B chỉ là một số. Tôi muốn tính kết quả được xác định là:Cách pythonic để tính điểm sản phẩm là gì?

kết quả = A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n- 1] [0] * B [n-1]

Tôi biết logic rất dễ nhưng cách viết theo cách nhiệt đới?

Cảm ơn!

+0

Cách 'A' có cấu trúc, đó là một danh sách 2D/ma trận. – igaurav

Trả lời

2

Có lẽ cách Pythonic nhất cho loại điều này là sử dụng numpy. ;-)

12

yêu thích sản phẩm Pythonic dot của tôi là:

sum([i*j for (i, j) in zip(list1, list2)]) 


Vì vậy, cho trường hợp của bạn, chúng tôi có thể làm:

sum([i*j for (i, j) in zip([K[0] for K in A], B)]) 
3

Sử dụng các nhà điều hành và các module itertools: giải pháp

from operator import mul 
from itertools import imap 

sum(imap(mul, A, B)) 
15
from operator import mul 

sum(map(mul, A, B)) 
0

Điều này có thể được lặp đi lặp lại, tuy nhiên:

>>> u = [(1, 2, 3), (4, 5, 6)] 
>>> v = [3, 7] 

Trong đồng bằng Python:

>>> sum([x*y for (x, *x2), y in zip(u,v)]) 
31 

Hoặc sử dụng numpy (như mô tả trong câu trả lời user57368 's):

import numpy as np 
>>> np.dot(np.array(u)[:,0], v) 
31 
17

Python 3.5 có một nhà điều hành rõ ràng @ cho sản phẩm dot, vì vậy bạn có thể viết

a = A @ B 

thay vì

a = numpy.dot(A,B) 
0

Tất cả các câu trả lời ở trên đều đúng, nhưng theo ý kiến ​​của tôi, cách để tính toán dấu chấm sản phẩm là:

>>> a=[1,2,3] 
>>> b=[4,5,6] 
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b))) 
32 
1
>>> X = [2,3,5,7,11] 
>>> Y = [13,17,19,23,29] 
>>> dot = lambda X, Y: sum(map(lambda x, y: x * y, X, Y)) 
>>> dot(X, Y) 
652 

Và đó là nó.

0

Sử dụng more_itertools, thư viện của bên thứ ba thực hiện các dotproductitertools recipe:

import more_itertools as mit 


a = [1, 2, 3] 
b = [7, 8, 9] 

mit.dotproduct(a, b) 
# 50 
Các vấn đề liên quan