2015-06-22 8 views
5

यहां मेरी समस्या है: मैं 432*46*136*136 ग्रिड को time*(space) का प्रतिनिधित्व करता हूं जो numpy और python के साथ numpy arrays में शामिल है। मेरे पास एक सरणी alt है, जिसमें ग्रिड पॉइंट्स की ऊंचाई शामिल है, और एक और सरणी temp जो ग्रिड पॉइंट्स का तापमान संग्रहीत करती है।सार्वभौमिक कार्यों का उपयोग करके पाइथन numpy ग्रिड परिवर्तन

यह एक तुलना के लिए समस्याग्रस्त है: अगर T1 और T2 हैं दो परिणाम, T1[t0,z0,x0,y0] और T2[t0,z0,x0,y0], H1[t0,z0,x0,y0] और मीटर की दूरी पर तापमान का प्रतिनिधित्व क्रमश। लेकिन मैं एक ही ऊंचाई पर बिंदुओं के तापमान की तुलना करना चाहता हूं, न कि एक ही ग्रिड बिंदु पर।

इसलिए मैं ऊंचाई का प्रतिनिधित्व करने के लिए मेरी ग्रिडिस के जेड-अक्ष को संशोधित करना चाहता हूं, न कि ग्रिड बिंदु। मैं एक समारोह conv(alt[t,z,x,y]) बनाता हूं जो प्रत्येक ऊंचाई पर -20 और 200 के बीच एक संख्या को विशेषता देता है। यहां मेरा कोड है:

def interpolation_extended(self,temp,alt): 
    [t,z,x,y]=temp.shape 
    new=np.zeros([t,220,x,y]) 
    for l in range(0,t): 
     for j in range(0,z): 
      for lat in range(0,x): 
      for lon in range(0,y): 
       new[l,conv(alt[l,j,lat,lon]),lat,lon]=temp[l,j,lat,lon] 
    return new 

लेकिन यह निश्चित रूप से बहुत अधिक समय लेता है, मैं इसे काम नहीं कर सकता। मैंने numpy के साथ सार्वभौमिक कार्यों का उपयोग करके इसे लिखने की कोशिश की:

def interpolation_extended(self,temp,alt): 
    [t,z,x,y]=temp.shape 
    new=np.zeros([t,220,x,y]) 
    for j in range(0,z): 
     new[:,conv(alt[:,j,:,:]),:,:]=temp[:,j,:,:] 
    return new 

लेकिन यह काम नहीं करता है। क्या आपको 4 नेस्टेड लूपों का उपयोग किये बिना पायथन/numpy में ऐसा करने का कोई विचार है?

धन्यवाद

+0

ऐसा इसलिए हो सकता है क्योंकि पाइथन में फ़ंक्शन कॉल महंगा हैं। उदाहरण के साथ 'रूपांतरण' समन्वय को पूर्ववत करना 'सेफंक्शन 'numpy विधि मदद कर सकता है। – Ashalynd

+0

क्या ज़ेड 220 से बड़ा है? अगर ऐसा है तो मैं देख सकता हूं कि आपका कोड क्यों दुर्घटनाग्रस्त हो जाएगा। – jfish003

+0

'alt' का कोई रैखिक संयोजन/कार्य 'conv' है? क्या आप उदाहरण दे सकते हैं या अपना कोड 'conv' के लिए पोस्ट कर सकते हैं? यदि 'रूपांतरण' को सदिशित किया जा सकता है, तो आप इसे 1 लाइनर में लिख सकते हैं। –

उत्तर

3

के बाद से मैं अपने मैट्रिक्स की जरूरत नहीं है मैं वास्तव में कोड की कोशिश नहीं कर सकते हैं, लेकिन कुछ इस तरह काम करना चाहिए।

पहले, बजाय एक समारोह के रूप conv घोषित करने के लिए, अपने सभी डेटा के लिए पूरे ऊंचाई प्रक्षेपण मिलती है:

conv = np.round(alt/500.).astype(int) 

np.round दौर के numpys संस्करण का उपयोग करना, यह vectorizing द्वारा मैट्रिक्स के सभी तत्वों दौर सी में संचालन, और इस प्रकार, आपको एक नई सरणी बहुत जल्दी मिलती है (सी गति पर)। निम्नलिखित लाइन ऊंचाई संरेखित 0 में शुरू करने के लिए, अपने न्यूनतम मूल्य से सभी सरणी स्थानांतरण (आपके मामले में, -20):

conv -= conv.min() 

रेखा से ऊपर अपने ऊंचाई मैट्रिक्स [-20, 200 से परिणत हो गया ] [0, 220] (अनुक्रमण के लिए बेहतर)।

इसी के साथ

, प्रक्षेप बहुआयामी सूचकांक हो रही द्वारा आसानी से किया जा सकता है:

t, z, y, x = np.indices(temp.shape) 

वैक्टर ऊपर सभी सूचकांकों सूचकांक अपने मूल मैट्रिक्स करने के लिए आवश्यक होते हैं। इसके बाद आप नया मैट्रिक्स बनाकर कर सकते हैं:

new_matrix[t, conv[t, z, y, x], y, x] = temp[t, z, y, x] 

बिना किसी लूप के।

अगर यह काम करता है तो मुझे बताएं। यह आपको कुछ त्रुटियां दे सकता है क्योंकि डेटा के बिना परीक्षण करने के लिए मेरे लिए मुश्किल है, लेकिन इसे नौकरी करना चाहिए।


निम्नलिखित खिलौना उदाहरण ठीक काम करता है:

A = np.random.randn(3,4,5) # Random 3x4x5 matrix -- your temp matrix 
B = np.random.randint(0, 10, 3*4*5).reshape(3,4,5) # your conv matrix with altitudes from 0 to 9 
C = np.zeros((3,10,5)) # your new matrix 

z, y, x = np.indices(A.shape) 
C[z, B[z, y, x], x] = A[z, y, x] 

C ऊंचाई के अनुसार अपने परिणामों में शामिल है।

+0

यह पूरी तरह से काम करता है, बहुत बहुत धन्यवाद। मुझे इंडेक्स के साथ वैक्टर के रूप में काम करने की संभावना के बारे में भी पता नहीं था। मुझे बदलना पड़ा: 'conv = np.round (alt/500.)' to 'conv = np.round (alt/500।)। Astype (int) 'इंडेक्स के रूप में रूपांतरण का उपयोग करने के लिए। –

+0

@ अर्नुड प्रोस्ट धन्यवाद! पहले ही संपादित किया गया है वेक्टर सूचकांक बहुत उपयोगी हैं। उदाहरण के लिए: 'ए [[3, 7, 8],:] '(' ए' 2 डी सरणी के लिए) मैट्रिक्स की चौथी, 8 वीं और 9वी पंक्तियों को वापस कर देगा। 'Np.indices' का उपयोग करने वाला उत्तर एक बहुआयामी सरणी में सभी अक्ष के सभी तत्वों को अनुक्रमणित करके एक विस्तार है। –

संबंधित मुद्दे