2013-02-22 85 views
5

पायथन में न्यूमेरिक कोड के साथ खेलना शुरू करने से पहले एक छोटे से अभ्यास के रूप में मैं एक एलडीएलटी एल्गोरिदम बनाने की कोशिश कर रहा हूं। बस "पैर गीले" पाने के लिए।बेसिक न्यूम्पी सरणी मान असाइनमेंट

हालांकि मुझे लगता है कि numpy सरणी की मौलिक समझ की कमी है। निम्नलिखित उदाहरण देखें:

def ldlt(Matrix): 
    import numpy 

    (NRow, NCol) = Matrix.shape 

    for col in range(NCol): 
     Tmp = 1/Matrix[col,col] 
     for D in range(col+1, NCol): 
      Matrix[col,D] = Matrix[D,col]*Tmp 

if __name__ == '__main__': 
    import numpy 
    A = numpy.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
    ldlt(A) 

उदाहरण पूर्ण कोड नहीं है जिस पर मैं काम कर रहा हूं। हालांकि, कोशिश करें और इसे चलाएं, और मैट्रिक्स [कॉल, डी] = ...

मुझे पहले मूल्यांकन के लिए क्या उम्मीद है कि पंक्ति 0 कॉलम 1 (-1 का प्रारंभ मूल्य) होना चाहिए बराबर = -1 * (1/2) = -0.5 सेट करें।

हालांकि कोड चलाने पर यह 0 के बराबर सेट लगता है क्यों? कुछ मौलिक होना चाहिए जो मुझे वास्तव में समझा नहीं गया है?

आपके सभी लोगों की मदद करने के लिए अग्रिम धन्यवाद।

संपादित करें 1:

अजगर वर .: 3.3 Tmp .: 0.5 बन (मेरे डिबगर की रिपोर्ट के अनुसार)।

उत्तर

3

निम्नलिखित दिखा सकते हैं क्या हो रहा है:

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
>>> A.dtype 
dtype('int32') 
>>> A[0, 1] 
-1 
>>> A[0, 1] * 0.5 
-0.5 
>>> A[0, 1] *= 0.5 
>>> A[0, 1] 
0 
>>> int(-0.5) 
0 

आपका सरणी केवल 32-बिट पूर्णांक पकड़ कर सकते हैं, इसलिए किसी भी चल बिन्दु मूल्य तुम कोशिश आवंटित करने के लिए इसे एक int32 करने के लिए, यानी छोटा कर दिया जाएगा। , छोरों के लिए आम तौर पर परहेज किया जाता है क्योंकि वे numpy का पूरा उद्देश्य हार:


एक ही कीमत के लिए, यहां क्या कर तुम क्या कर रहे थे के बाद की एक और अधिक numpythonic तरीका है

def ldlt_np(arr) : 
    rows, cols = arr.shape 
    tmp = 1/np.diag(arr) # this is a float array 
    mask = np.tril_indices(cols) 
    ret = arr * tmp[:, None] # this will also be a float array 
    ret[mask] = arr[mask] 

    return ret 

>>> A = np.array([[2,-1,0],[-1,2,-1],[0,-1,2]]) 
>>> ldlt_np(A) 
array([[ 2. , -0.5, 0. ], 
     [-1. , 2. , -0.5], 
     [ 0. , -1. , 2. ]]) 
+0

यूप यह था। बहुत बहुत धन्यवाद - इससे पहले कि मैं उस पर ठोकर खा गया था, यह लंबे समय से होता। – Daniel

0

numpy सरणी के पास निश्चित प्रकार है। आप बाद में तैरने के लिए int सरणी नहीं बदल सकते हैं। तैरता की एक सरणी के रूप में सरणी प्रारंभ:

A = numpy.array([[2, -1, 0], [-1, 2, -1], [0, -1, 2]], numpy.float) 
+0

मैं पर हूँ पायथन 3.3। कोड का मेरा टुकड़ा जांचना - टीएमपी मूल्यांकन पर 0.5 हो गया। – Daniel

+0

संपादित, लेकिन बहुत देर हो चुकी है :) –