2015-05-17 12 views
5

मैं निम्नलिखित आयामों के साथ इन चरों है:सबसे तेजी से रास्ता Numpy उपयोग करने के लिए - बहुआयामी रकम और उत्पादों

A - (3,) 
B - (4,) 
X_r - (3,K,N,nS) 
X_u - (4,K,N,nS) 
k - (K,) 

और मैं हर संभव n और s, जिस तरह से मैं इसे कर रहा हूँ के लिए (A.dot(X_r[:,:,n,s])*B.dot(X_u[:,:,n,s])).dot(k) गणना करने के लिए चाहते हैं अब वह इस प्रकार है:

np.array([[(A.dot(X_r[:,:,n,s])*B.dot(X_u[:,:,n,s])).dot(k) for n in xrange(N)] for s in xrange(nS)]) #nSxN 

लेकिन इस सुपर धीमी है और मैं अगर वहाँ यह करने का एक बेहतर तरीका था सोच रहा था लेकिन मुझे यकीन नहीं कर रहा हूँ।

लेकिन वहाँ एक और गणना है कि मैं कर रहा हूँ और मुझे यकीन है कि यह अनुकूलित किया जा सकता हूँ:

np.sum(np.array([(X_r[:,:,n,s]*B.dot(X_u[:,:,n,s])).dot(k) for n in xrange(N)]),axis=0) 

इस एक मैं सिर्फ एक धुरी में यह योग और बाद सरणी त्यागने के लिए एक numpy सरणी बनाने हूँ में । यदि यह 1-डी में एक सूची थी, तो मैं reduce का उपयोग करूंगा और इसे अनुकूलित करूँगा, मुझे numpy सरणी के लिए क्या उपयोग करना चाहिए?

उत्तर

4

का उपयोग करते हुए कुछ np.einsum कॉल -

# Calculation of A.dot(X_r[:,:,n,s]) 
p1 = np.einsum('i,ijkl->jkl',A,X_r) 

# Calculation of B.dot(X_u[:,:,n,s]) 
p2 = np.einsum('i,ijkl->jkl',B,X_u) 

# Include .dot(k) part to get the final output 
out = np.einsum('ijk,i->kj',p1*p2,k) 

दूसरे उदाहरण के बारे में, यह यह हल करती है:

p1 = np.einsum('i,ijkl->jkl',B,X_u)#OUT_DIM - (k,N,nS) 
sol = np.einsum('ijkl,j->il',X_r*p1[None,:,:,:],k)#OUT_DIM (3,nS) 
+0

@ JoãoAbrantes संपादन में पी 5 क्या है? क्या यह पी 1 होना चाहिए? – Divakar

+0

हाँ यह पी 1 होना चाहिए! –

+0

@ JoãoAbrantes आपके संपादन की सराहना करते हैं! – Divakar

3

आप उच्च आयामों में मैट्रिक्स के गुणन के लिए dot उपयोग कर सकते हैं लेकिन चल सूचकांक होना चाहिए आखिरी दो। जब हम अपने मैट्रिक्स को पुन: व्यवस्थित

X_r_t = X_r.transpose(2,3,0,1) 
X_u_t = X_u.transpose(2,3,0,1) 

हम

res2_imp = np.sum((X_r_t * B.dot(X_u_t)[:,:,None,:]).dot(k),axis=0)[-1] 

समय आपकी पहली अभिव्यक्ति

res1_imp = (A.dot(X_r_t)*B.dot(X_u_t)).dot(k).T # shape nS x N 

के लिए और दूसरा अभिव्यक्ति के लिए प्राप्त

Divakars समाधान मेरे पर देता है कंप्यूटर 10000 loops, best of 3: 21.7 µs per loop

मेरी समाधान 10000 loops, best of 3: 101 µs per loop

संपादित

मेरे ऊपरी समय दोनों भाव की गणना शामिल देता है। जब मैं केवल पहली अभिव्यक्ति (Divakar के रूप में) प्राप्त करता हूं तो मुझे 10000 loops, best of 3: 41 µs per loop प्राप्त होता है ... जो अभी भी धीमा है लेकिन उसके समय के करीब

+0

रनटाइम संपादन की सराहना करें! इस समाधान में प्रस्तुत वैकल्पिक विकल्प दृष्टिकोण। – Divakar

+0

आपके उत्तर के लिए धन्यवाद, यह सबसे तेज़ तरीका नहीं था, लेकिन उसने मुझे उस बारे में कुछ सिखाया जो मुझे नहीं पता था और मुझे यकीन है कि यह भविष्य में मेरे लिए उपयोगी होगा! +1 –

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