/ / अजगर के भीतर नेस्टेड छोरों को हटाना - अजगर, सुन्न, नेस्टेड-लूप

पाइथन के भीतर नेस्टेड लूप को हटा रहा है - पायथन, numpy, नेस्टेड-loops

मैं अपने कोड को गति देने की कोशिश कर रहा हूं। सबसे बड़ी समस्या कुछ नेस्टेड लूप्स हैं जो मेरे पास हैं (उन्हें 25000 से अधिक कोशिकाओं को पुनरावृत्त करना होगा)। हालांकि, जब मैं इन नेस्टेड छोरों से छुटकारा पाने की कोशिश करता हूं, तो मुझे एक अलग परिणाम मिलता है और मुझे लगता है कि क्यों नहीं मिल रहा है।

यह नेस्टेड लूप में से एक है:

for i in range(N):
for j in range(N):
# value added in sector i (month k+1)
VA[i,k+1]= VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])

आंतरिक पाश से छुटकारा पाने के लिए मैंने यही किया:

for in range(N):
VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

बहुत बहुत आपकी मदद के लिए धन्यवाद।

उत्तर:

उत्तर № 1 के लिए 1

समस्या यह है कि VA को असाइन करना VA.dtype के प्रकार को रोकता है, इसलिए यदि VA.dtype परिणाम से कम सटीक है, तो आप सटीकता खो सकते हैं VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0]).

इस गोलाई को बनाए रखने के लिए आप चाहते हैं:

for i in range(N):
# value added in sector i (month k+1)
VA[i,k+1] -= (IO[:,i]*(Produc[i,k+1]/Produc[i,0])).astype(VA.dtype).sum()

... यह मानते हुए कि आप अधिक सटीक संस्करण के साथ अधिक खुश नहीं हैं!

कुछ और श्रमसाध्य शोधों से पता चला है कि यदिघटाव 0 के माध्यम से डेटा लेते हैं, व्यवहार isn "पूरी तरह से उत्सर्जित नहीं होता है। मैं हालांकि परेशान नहीं करूंगा, क्योंकि सूक्ष्म बग का अनुकरण करना समय की बर्बादी है;)


ध्यान दें कि यदि आप "से खुश हैं

for in range(N):
VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

आप भी कर सकते हैं

VA[:,k+1] -= IO.sum(axis=0) * Produc[:,k+1] / Produc[:,0]

जो मुझे लगता है कि बराबर है।


ध्यान दें कि यह मानता है कि N इनमें से काफी के लिए एकदम सही फिट है। यह हो सकता है VA[:N, :N] वीए का एक सबसेट है, जिस स्थिति में यह समस्या है और आपको सब कुछ करना चाहिए N गणना के भीतर।