2015-01-31 6 views
5

के बिना एक मैट्रिक्स द्वारा एक वेक्टर गुणा करें मैं पाइथन के लिए बिल्कुल नया हूं और मैट्रिक्स (किसी कॉलम आकार के) द्वारा वेक्टर को गुणा करने के लिए एक फ़ंक्शन बनाने की कोशिश कर रहा हूं। जैसे:पायथन 3: बिना किसी नकली

multiply([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 

[1, 1] 

यहाँ मेरी कोड है:

def multiply(v, G): 
    result = [] 
    total = 0 
    for i in range(len(G)): 
     r = G[i] 
     for j in range(len(v)): 
      total += r[j] * v[j] 
     result.append(total) 
    return result 

समस्या यह है कि जब मैं मैट्रिक्स (r [जे]) त्रुटि में प्रत्येक स्तंभ की पहली पंक्ति के चयन का प्रयास 'की सूची सूचकांक से बाहर सूचकांक 'दिखाया गया है। क्या NumPy का उपयोग किये बिना गुणा को पूरा करने का कोई और तरीका है?

उत्तर

7

Numpythonic दृष्टिकोण: (क्रम में दो मैट्रिक्स के डॉट उत्पाद प्राप्त करने के लिए numpy.dot का उपयोग कर)

In [1]: import numpy as np 

In [3]: np.dot([1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]]) 
Out[3]: array([1, 1]) 

pythonic दृष्टिकोण:

अपने दूसरे for पाश की लंबाई len(v) है और आप करने का प्रयास इंडेक्सिंग v उस पर आधारित है इसलिए आपको इंडेक्स त्रुटि मिली है। एक और अधिक pythonic तरीका के रूप में आप प्राप्त करने के लिए एक सूची के स्तंभों तो एक सूची समझ भीतर starmap और mul का उपयोग zip फ़ंक्शन का उपयोग कर सकते हैं:

In [13]: first,second=[1,0,0,1,0,0], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 

In [14]: from itertools import starmap 

In [15]: from operator import mul 

In [16]: [sum(starmap(mul, zip(first, col))) for col in zip(*second)] 
Out[16]: [1, 1] 
+1

ऐसा लगता है कि यह शुरुआत के लिए उपयुक्त नहीं है। – physicalattraction

+1

@physicalattraction मैं और विवरण जोड़ूंगा;) – Kasramvd

+0

धन्यवाद। मैं ज़िप समारोह में नहीं आया था - यह बहुत आसान बनाता है! एक आखिरी बात, जब मैं योग वापस करने की कोशिश करता हूं तो मुझे सिंटैक्स त्रुटि मिल रही है (mul (k, t))। यह बाहरी वर्ग ब्रैकेट को हाइलाइट किया गया है, जो मुझे लगता है कि एक सूची के रूप में राशि देता है? – JGraham353

2

rG से एक तत्व है इसलिए यह एक पंक्ति है जिसमें केवल दो तत्व हैं। इसका मतलब है कि आप r से मान प्राप्त करने के लिए इंडेक्स j का उपयोग नहीं कर सकते हैं क्योंकि jv की लंबाई तक 0 से चला जाता है, जो आपके उदाहरण में 6 है।

1

मैं समाधान जहां पहले मैट्रिक्स 2-आयामी हो सकता है की जरूरत है। @ Kasramvd से दो आयामी first मैट्रिक्स को स्वीकार करने के लिए समाधान को विस्तारित करना। यहाँ संदर्भ के लिए प्रकाशित किया गया था:

>>> first,second=[[1,0,0,1,0,0],[0,1,1,1,0,0]], [[0,1],[1,1],[1,0],[1,0],[1,1],[0,1]] 
>>> from itertools import starmap 
>>> from operator import mul 
>>> [[sum(starmap(mul, zip(row, col))) for col in zip(*second)] for row in first] 
[[1, 1], [3, 1]] 
2

मुझे लगता है कि अपने कोड के साथ समस्या यह थी कि आप मैट्रिक्स के बजाय स्तंभों के आधार पर पंक्तियों के माध्यम से लूप। साथ ही आप प्रत्येक वेक्टर * मैट्रिक्स कॉलम गणना के बाद अपने 'कुल' चर को रीसेट नहीं करते हैं। यह तुम क्या चाहते है:

def multiply(v, G): 
    result = [] 
    for i in range(len(G[0])): #this loops through columns of the matrix 
     total = 0 
     for j in range(len(v)): #this loops through vector coordinates & rows of matrix 
      total += v[j] * G[j][i] 
     result.append(total) 
    return result 
0

मैं आव्यूह गुणन के लिए एक कोड संलग्न किया है एक आयामी गुणन के लिए उदाहरण के प्रारूप का पालन (सूची की सूची)

def MM(a,b): 
c = [] 
for i in range(0,len(a)): 
    temp=[] 
    for j in range(0,len(b[0])): 
     s = 0 
     for k in range(0,len(a[0])): 
      s += a[i][k]*b[k][j] 
     temp.append(s) 
    c.append(temp) 

return c 
a=[[1,2]] 
b=[[1],[2]] 
print(MM(a,b)) 

परिणाम है [[5]]