2009-08-29 12 views
10

मैं कुछ कोड मुझे लगता है कि पढ़ रहा हूँ में एक अजगर ndarray अस्थायी है इस ग्रस्त है: (। यानी, मीटर के बराबर * मी)मैट्रिक्स ** 2 पाइथन/numpy में क्या मतलब है?

x = temp**2 

इस डॉट वर्ग है या मैट्रिक्स वर्ग (यानी मीटर होना चाहिए एक वर्ग मैट्रिक्स)? विशेष रूप से, मुझे पता है कि मैं इस कोड में पक्षांतरित से छुटकारा पाने सकते हैं कि क्या करना चाहते हैं:

temp = num.transpose(whatever) 
num.sum(temp**2,axis=1)) 

और यह इस में बदल जाते हैं:

num.sum(whatever**2,axis=0) 

जो मुझे कम से कम 0.1ms में बचत होगी, और यह मेरे समय के लायक है।
धन्यवाद! ** ऑपरेटर ungooglable है और मुझे कुछ भी नहीं पता!

उत्तर

12

यह प्रत्येक तत्व का वर्ग है।

from numpy import * 
a = arange(4).reshape((2,2)) 
print a**2 

प्रिंट

[[0 1] 
[4 9]] 
+1

वूट, धन्यवाद। Fifteeeeenherewecome। –

+1

आपका स्वागत है। (मैंने संभवतः स्पष्ट नोट को इंगित करने पर हस्ताक्षर किए हैं कि यदि आप हैं, तो ndarray> 2 आयाम हैं, मुझे नहीं लगता कि ट्रांसपोज़िंग, अक्ष स्वैपिंग चीज काम करेगी।) – tom10

+1

मैं देख सकता हूं कि यह कहां भ्रमित हो सकता है। पाइथन को जानने के बिना, और समझने के लिए कि वास्तविक (और जटिल) संख्याओं के लिए वर्गिंग का मतलब है "एक संख्या स्वयं से गुणा करें", यह मानना ​​उचित होगा कि इसका मतलब मैट्रिक्स के लिए "स्वयं द्वारा एक मैट्रिक्स गुणा करें" था। इसका मतलब है कि मैट्रिक्स में पंक्तियों और स्तंभों की समान संख्या है। – duffymo

4

**, पायथन में उठाने करने वाली शक्ति ऑपरेटर है तो x**2 का अर्थ है "x वर्ग" अजगर में - numpy भी शामिल है। Numpy में इस तरह के संचालन हमेशा तत्व द्वारा तत्व लागू करते हैं, इसलिए x**2 सरणी x (जो भी आयामों की संख्या) की तरह है, कहते हैं, x*2 प्रत्येक तत्व को दोगुना कर देगा, या x+2 प्रत्येक तत्व को दो से बढ़ाएगा (प्रत्येक मामले में, x उचित अप्रभावित है - परिणाम x के समान आकार की एक नई अस्थायी सरणी है!)।

संपादित: के रूप में @ kaizer.ze बताते हैं, जबकि मैं क्या लिखा है numpy.array वस्तुओं के लिए रखती है, यह numpy.matrix वस्तुओं, जहां गुणा array के लिए की तरह तत्व आपरेशन द्वारा तत्व आव्यूह गुणन के बजाय इसका मतलब है पर लागू नहीं होता है (और इसी तरह सत्ता में वृद्धि के लिए) - वास्तव में, यह दो प्रकार के बीच महत्वपूर्ण अंतर है। Scipy tutorial का कहना है उदाहरण के लिए,:

जब हम numpy.array या numpy.matrix का उपयोग वहाँ एक अंतर है। ए * एक्स बाद के मामले मैट्रिक्स उत्पाद में होगा, तत्व के अनुसार उत्पाद नहीं सरणी के साथ।

अर्थात, numpy reference यह कहते हैं:

एक मैट्रिक्स एक विशेष 2-डी सरणी कि संचालन के माध्यम से अपनी 2-डी प्रकृति को बरकरार रखे हुए है। इसमें कुछ विशेष ऑपरेटर हैं, जैसे * (मैट्रिक्स गुणा) और ** (मैट्रिक्स पावर)।

+1

वैसे यह दुखद रूप से इतना आसान नहीं है, जैसा कि मैंने उत्तर दिया था; 'सरणी 'और' मैट्रिक्स 'के अलग-अलग व्यवहार इस बात को भ्रमित कर सकते हैं, और ऑपरेटर जैसे * *' और '**' अर्थ बदलते हैं! (यदि ए * बी मैट्रिक्स गुणा है, ए, बी मैट्रिक्स, ए ** 2 को मैट्रिक्स एक्सपोनेंटिएशन होना चाहिए।) – u0b34a0f6ae

+0

हां, मैट्रिक्स और सरणी के बीच एक अंतर है - हालांकि '**' निश्चित रूप से अभी भी उठाया गया है टू-पावर ऑपरेशन, मैट्रिक्स पर ऑपरेशन "तत्वों" के लिए सरणी पर "मैट्रिक्स" पर लागू होते हैं। अच्छा बिंदु, मुझे स्पष्टीकरण के लिए संपादित करने दें। –

5

आपको NumPy for Matlab Users पढ़ना चाहिए। तत्वानुसार पावर ऑपरेशन का उल्लेख किया गया है, और आप यह भी देख सकते हैं कि numpy में, कुछ ऑपरेटरों array और matrix पर अलग-अलग लागू होते हैं।

>>> from numpy import * 
>>> a = arange(4).reshape((2,2)) 
>>> print a**2 
[[0 1] 
[4 9]] 
>>> print matrix(a)**2 
[[ 2 3] 
[ 6 11]] 
संबंधित मुद्दे