2014-05-08 4 views
9

यह numpy के लिए कोड मैं सप्टक में है अपवाद। जब मैंने थोड़ा सा शोध किया तो मैंने पाया कि तत्व-वार गुणा पाइथन एरे पर काम नहीं करेगा (विशेष रूप से यदि एक्स और वाई प्रकार "numpy.ndarray" हैं)। तो मैं सोच रहा था कि क्या कोई इसे थोड़ा और समझा सकता है - यानी एक अलग प्रकार के ऑब्जेक्ट काम पर कास्टिंग टाइप करेंगे? ऑक्टेव कोड काम करता है इसलिए मुझे पता है कि मेरे पास रैखिक बीजगणित गलती नहीं है। मुझे लगता है कि bsxfun और numpy.multiply वास्तव में समकक्ष नहीं हैं लेकिन मुझे यकीन नहीं है कि क्यों कोई स्पष्टीकरण महान होगा।@times साथ bsxfun परिवर्तित

मैं website ढूंढने में सक्षम था! जो ऑक्टैव को मैटलैब फ़ंक्शन रूपांतरणों को देता है लेकिन यह मेरे मामले में मदद नहीं प्रतीत होता है।

+0

यह सवाल जब आप 'राशि()' NumPy में आप सही 'axis' चयन कर रहे हैं लागू विषय से हटकर हो सकता है क्योंकि यह कोड अनुवाद – jonrsharpe

+0

के लिए एक अनुरोध है प्रकट होता है? –

+0

"मुझे बहुत परेशानी हो रही है" बहुत जानकारीपूर्ण नहीं है। कृपया जो व्यवहार आप देखते हैं उसका वर्णन करें, ऐसा करने के लिए एक पुन: उत्पादित उदाहरण सबसे अच्छा तरीका है। –

उत्तर

10

bsxfun मैटलैब में द्विआधारी सिंगलटन विस्तार के लिए खड़ा है, इसमें numpy में इसे प्रसारण कहा जाता है और स्वचालित रूप से होना चाहिए। समाधान यानी अपने X के आयामों पर निर्भर करेगा, यह एक पंक्ति या स्तंभ वेक्टर है, लेकिन इस सवाल का जवाब एक ही रास्ता यह करने के लिए पता चलता है:

How to multiply numpy 2D array with numpy 1D array?

मुझे लगता है कि यहां मुद्दा यह है कि प्रसारित हो रहा है में से एक की आवश्यकता है आयाम 1 हो सकता है और, मैटलैब के विपरीत, numpy एक 1 आयामी 2 तत्व वेक्टर और एक 2 आयामी 2 तत्व के बीच अंतर करने लगता है, आकार (2,) की और आकार (2,1) के एक मैट्रिक्स के बीच का अंतर यानी, यदि आप बाद की जरूरत प्रसारण होने के लिए ।

+0

क्या numpy में कोई bxnfun नहीं है? अगर मैं उदाहरण के लिए एक तत्वानुसार राशि करना चाहता था तो क्या होगा। – Pinocchio

+0

तुम सिर्फ योग करते हैं, numpy स्वचालित रूप से एक आयाम में यह प्रसारण किया जाएगा। तो बस '+' numpy में 'bsxfun (@plus ,,)' मैटलैब में * प्रदान की * अपने numpy आयाम ठीक कह रहे हैं के रूप में ही है – Dan

+0

तो अजगर कोड सिर्फ सचमुच 'ए + b' या' ए * b' है (मानते हुए ए ने कहा है कि डीएक्स 1 और बी में 1 एक्स के हैं)। – Pinocchio

2

जो लोग Numpy पता नहीं है के लिए, मुझे लगता है कि उनका कहना है कि सप्टक (और मैटलैब का) * ऑपरेटर (आव्यूह गुणन) के समकक्ष numpy.dot है लायक है (और, debatably, numpy.outer)। Numpy's * ऑपरेटर ऑक्टैव में bsxfun(@times,...) के समान है, जो स्वयं .* का सामान्यीकरण है।

ऑक्टेव में, bsxfun लागू करते समय, ऑपरेटरों के "सही" आकार के दाईं ओर अंतर्निहित सिंगलटन आयाम होते हैं; यानी, n1 x n2 x n3 सरणी को n1 x n2 x n3 x 1 x 1 x 1 x... के रूप में माना जा सकता है। Numpy में, निहित सिंगलटन आयाम बाईं ओर हैं; इसलिए m1 x m2 x m3 को ... x 1 x 1 x m1 x m2 x m3 माना जा सकता है। ऑपरेंड आकारों पर विचार करते समय यह महत्वपूर्ण है: ऑक्टेव में bsxfun(@times,a,b) काम करेगा यदि 2 x 3 x 4 है और बी 2 x 3 है। अजीब में दो ऐसे एरे गुणा नहीं कर सका, लेकिन एक 2 x 3 x 4 और 3 x 4 सरणी गुणा कर सकता है।

अंत में, bsxfun(@times, X*Y, X) ऑक्टेव में शायद numpy.dot(X,Y) * X जैसा कुछ दिखाई देगा। अभी भी कुछ गॉथैस हैं: उदाहरण के लिए, यदि आप बाहरी उत्पाद की उम्मीद कर रहे हैं (यानी, ऑक्टेव एक्स में एक कॉलम वेक्टर, वाई एक पंक्ति वेक्टर है), तो आप इसके बजाय numpy.outer का उपयोग कर देख सकते हैं, या आकार के बारे में सावधान रहें एक्स और वाई

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