2011-05-07 10 views
20

मेरे पास दो सूचियां हैं, एक को ए के रूप में नामित किया गया है, दूसरा बी के रूप में नामित किया गया है। ए में प्रत्येक तत्व एक तिहाई है, और बी में प्रत्येक तत्व केवल एक संख्या है। मैं परिणाम की गणना करना चाहते हैं के रूप में परिभाषित:डॉट उत्पाद की गणना करने के लिए पाइथोनिक तरीका क्या है?

परिणाम = एक [0] [0] * बी [0] + A [1] [0] * बी [1] + ... + एक [n- 1] [0] * बी [एन -1]

मुझे पता है कि तर्क आसान है लेकिन पाइथोनिक तरीके से कैसे लिखना है?

धन्यवाद!

+0

रास्ता 'A' संरचित है, यह एक 2 डी सूची/मैट्रिक्स है। – igaurav

उत्तर

2

शायद इस तरह की चीज़ के लिए सबसे पाइथोनिक तरीका numpy का उपयोग करना है। ;-)

12

मेरा पसंदीदा pythonic डॉट उत्पाद है:

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


तो आपके मामले के लिए हम कर सकते हैं:

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

ऑपरेटर और itertools मॉड्यूल का उपयोग करना:

from operator import mul 
from itertools import imap 

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

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

यह दोहराया जा सकता है समाधान, तथापि:

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

सादा Python में:

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

या (user57368 के जवाब में वर्णित है) numpy का उपयोग कर:

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

अजगर 3.5 डॉट उत्पाद के लिए एक स्पष्ट ऑपरेटर @ है, ताकि आप

a = A @ B 
बजाय

लिख सकते हैं
a = numpy.dot(A,B) 
0

सभी उपरोक्त उत्तरों सही हैं, लेकिन मेरी राय में सबसे अधिक पाइथोनिक डॉट उत्पाद की गणना करने के तरीका है:

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

और बस हो गया।

0

more_itertools का उपयोग करना, को लागू करने वाली एक तीसरी पार्टी पुस्तकालय dotproductitertools recipe:

import more_itertools as mit 


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

mit.dotproduct(a, b) 
# 50 
संबंधित मुद्दे