2013-10-09 31 views
7

में एक आयाम के साथ रिग्रेशन मुझे 4-आयामी numpy सरणी (एक्स, वाई, जेड, समय) मिला है और समय x आयाम के माध्यम से numpy.polyfit करना चाहते हैं, प्रत्येक एक्स, वाई, जेड समन्वय पर । उदाहरण के लिए:एक numpy सरणी

import numpy as np 
n = 10  # size of my x,y,z dimensions 
degree = 2 # degree of my polyfit 
time_len = 5 # number of time samples 

# Make some data 
A = np.random.rand(n*n*n*time_len).reshape(n,n,n,time_len) 

# An x vector to regress through evenly spaced samples 
X = np.arange(time_len) 

# A placeholder for the regressions 
regressions = np.zeros(n*n*n*(degree+1)).reshape(n,n,n,degree+1) 

# Loop over each index in the array (slow!) 
for row in range(A.shape[0]) : 
    for col in range(A.shape[1]) : 
     for slice in range(A.shape[2]): 
      fit = np.polyfit(X, A[row,col,slice,:], degree) 
      regressions[row,col,slice] = fit 

मैं पाशन के सभी के माध्यम से जाने के बिना regressions सरणी के लिए प्राप्त करना चाहते हैं। क्या यह संभव है?

+1

[यह उत्तर] (http://stackoverflow.com/a/16315330/832621) आपके जैसी ही समस्या का एक उदाहरण देता है ... –

+2

@SulloCastro निश्चित है - लेकिन वह उत्तर अभी भी कोई प्रदर्शन लाभ नहीं खरीदता है एक सामान्य पायथन लूप पर, जो अधिक पठनीय आईएमओ –

उत्तर

9

अपने डेटा को दोबारा बदलें ताकि प्रत्येक टुकड़ा 2 डी सरणी के कॉलम पर हो। फिर एक बार पॉलीफिट चलाएं।

A2 = A.reshape(time_len, -1) 
regressions = np.polyfit(X, A2, degree) 
regressions = regressions.reshape(A.shape) 

या कुछ की तरह है कि ... मैं सच में समझ में नहीं आता क्या सभी आयाम अपने डेटासेट में के अनुरूप है, तो मुझे यकीन है कि वास्तव में क्या आकार आप चाहते हैं नहीं कर रहा हूँ। लेकिन मुद्दा यह है कि polyfit के लिए प्रत्येक व्यक्तिगत डेटासेट मैट्रिक्स A2 में एक कॉलम पर कब्जा कर लेना चाहिए।

वैसे, यदि आप प्रदर्शन में रूचि रखते हैं, तो आपको प्रोफ़ाइल मॉड्यूल या ऐसा कुछ उपयोग करके अपना कोड प्रोफाइल करना चाहिए। आम तौर पर बोलते हुए, आप हमेशा यह अनुमान लगा सकते हैं कि कोड को नजरअंदाज करके कितनी जल्दी कोड चलाएगा। आपको इसे चलाने के लिए है। यद्यपि इस मामले में लूप को हटाने से आपका कोड 100x अधिक पठनीय हो जाएगा, जो कि और भी महत्वपूर्ण है।

+2

+1 है, यह 'apply_along_axis',' vectorize' या 'apply_over_axes' का उपयोग करने से बहुत बेहतर समाधान है, क्योंकि यह वास्तव में सी कोड –

+2

के स्तर पर ऑपरेशन को सदिश बनाता है। बहुत काम किया। हालांकि बाहर निकला कि मुझे 'ए 2 = एटी। ताज़ाप (टाइम_लेन, -1)' और 'रिग्रेशन = रिग्रेशन की आवश्यकता है। ताज़ा ((एन, एन, एन, डिग्री + 1))' – ajwood