वास्तविक समस्या मैं हल करना चाहते हैं, एन इकाई वैक्टर का एक सेट और एम वैक्टर का एक और सेट इकाई से प्रत्येक के लिए गणना दिया जाता है की औसत वैक्टर एम वैक्टरों में से प्रत्येक के साथ डॉट उत्पाद का पूर्ण मूल्य। अनिवार्य रूप से यह दो matrices के बाहरी उत्पाद की गणना कर रहा है और बीच में फंसे एक पूर्ण मूल्य के साथ औसत और औसत।गैर तुच्छ numpy में temporaries बिना बाहरी उत्पादों की रकम
के लिए एन और एम नहीं बहुत बड़ी इस कठिन नहीं है और वहाँ आगे बढ़ने के लिए कई मायनों (नीचे देखें) कर रहे हैं। समस्या यह है कि एन और एम बड़े पैमाने पर बनाए गए अस्थायी हैं और प्रदान किए गए दृष्टिकोण के लिए व्यावहारिक सीमा प्रदान करते हैं। क्या यह गणना अस्थायी बनाने के बिना किया जा सकता है? मेरे पास मुख्य कठिनाई पूर्ण मूल्य की उपस्थिति के कारण है। क्या ऐसी गणनाओं को "थ्रेडिंग" के लिए सामान्य तकनीकें हैं?
एक उदाहरण के रूप में निम्नलिखित कोड
N = 7
M = 5
# Create the unit vectors, just so we have some examples,
# this is not meant to be elegant
phi = np.random.rand(N)*2*np.pi
ctheta = np.random.rand(N)*2 - 1
stheta = np.sqrt(1-ctheta**2)
nhat = np.array([stheta*np.cos(phi), stheta*np.sin(phi), ctheta]).T
# Create the other vectors
m = np.random.rand(M,3)
# Calculate the quantity we desire, here using broadcasting.
S = np.average(np.abs(np.sum(nhat*m[:,np.newaxis,:], axis=-1)), axis=0)
यह बहुत अच्छा है पर विचार करें, एस अब लंबाई एन की एक सरणी है और वांछित परिणाम होता है। दुर्भाग्यवश इस प्रक्रिया में हमने कुछ संभावित विशाल सरणी बनाई हैं।
np.sum(nhat*m[:,np.newaxis,:], axis=-1)
का परिणाम एक एम एक्स एन सरणी है। अंतिम परिणाम, निश्चित रूप से, आकार एन का आकार है। एन और एम के आकारों को बढ़ाना शुरू करें और हम जल्दी से स्मृति त्रुटि में भाग लें।
जैसा कि ऊपर बताया, अगर निरपेक्ष मान आवश्यकता नहीं थी तो हम, के रूप में इस प्रकार अब einsum()
T = np.einsum('ik,jk,j', nhat, m, np.ones(M))/M
का उपयोग कर यह काम करता है और काफी बड़ी एन और एम के लिए भी जल्दी से काम करता है आगे बढ़ सके। विशिष्ट समस्या के लिए मुझे abs()
शामिल करने की आवश्यकता है, लेकिन एक अधिक सामान्य समाधान (शायद अधिक सामान्य ufunc) भी ब्याज का होगा।
आप [ 'dot'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html) और कुछ अक्ष में नगण्य साथ यह कर सकते हैं? – user2357112
['tensordot'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.tensordot.html#numpy.tensordot) अधिक उपयोगी हो सकता है। – user2357112
यह स्पष्ट नहीं है कि यह 'abs()' की आवश्यकता के कारण कैसे मदद करता है। यदि यह नहीं था तो प्रश्न में 'einsum()' अभिव्यक्ति आदर्श होगी! –