NumPy में MATLAB के प्रत्यावर्तन के बराबर क्या है


103

मैं NumPy का उपयोग करते हुए निम्नलिखित MATLAB कोड के बराबर निष्पादित करना चाहता हूं repmat([1; 1], [1 1 1]):। मैं इसे कैसे पूरा करूंगा?

जवाबों:


103

मतलाब उपयोगकर्ता लिंक के लिए यहां एक बहुत बेहतर (आधिकारिक) न्यूमपी है - मुझे डर है कि मैथ्यूज़ एक बहुत पुराना है।

के बराबर repmat(a, m, n)है tile(a, (m, n))

यह कई आयामों के साथ काम करता है और matlab के समान परिणाम देता है। (Numpy 3 डी आउटपुट ऐरे देता है जैसा कि आप उम्मीद करेंगे - किसी कारण से matlab 2d आउटपुट देता है - लेकिन सामग्री समान है)।

Matlab:

>> repmat([1;1],[1,1,1])

ans =
     1
     1

अजगर:

In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]: 
array([[[1],
        [1]]])

2
जब मैं आकार की कोशिश करता हूं (repmat ([1; 1], [1,1,2])) यह ans = 2 1 2 [matlab में] मिलता है, लेकिन अजगर np.tile (ए, [1,1,2]) में इसे प्राप्त करें (1, 2, 2), मैं चाहते हैं कि परिणाम मैटलैब के समान हो
vernomcrp

2
np.tile ([[:, np.newaxis], [1,1,2]) - यह समान देता है। समस्या टाइल है जो आवश्यक के रूप में नए कुल्हाड़ियों को प्रचलितa करके टाइल तर्क के आयाम को बढ़ावा देता है। मतलब दूसरे तरीके से काम करता दिख रहा है। इसी तरह, 4d टाइलिंग के साथ आपको दो बार newaxis की आवश्यकता होगी ... ताकि आवश्यक हो ...np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
Rob

17

ध्यान दें कि कुछ कारणों से जिन्हें आपको MATLAB के रिपीट उपयोग करने की आवश्यकता होगी, उन पर NumPy के प्रसारण तंत्र द्वारा ध्यान दिया जाता है, जो आपको समान आकार के सरणियों के साथ विभिन्न प्रकार के गणित करने की अनुमति देता है। तो अगर आप कहते हैं, एक 1600x1400x3 सरणी एक 3-रंग छवि का प्रतिनिधित्व करते हैं, तो आप प्रत्येक तत्व [1.0 0.25 0.25]पर हरे और नीले रंग की मात्रा को कम करने के लिए इसे (मूल रूप से) गुणा कर सकते हैं । अधिक जानकारी के लिए उपरोक्त लिंक देखें।


2
नहीं है कि Matlab इस प्रसारण के रूप में अच्छी तरह से कर सकते हैं, अगर आप का उपयोग करें bsxfun
जेरिट


8

यह है कि मैं इसे समझ गया था कि चारों ओर कुछ गड़बड़ है। सही होने की खुशी और उम्मीद है कि यह मदद करता है।

मान लें कि आपके पास 2x3 तत्वों का एक मैट्रिक्स M है। इसके दो आयाम हैं, जाहिर है।


मैं मैट्रिक्स के पहले से ही आयामों के साथ इनपुट मैट्रिक्स में हेरफेर करने के लिए पूछते समय मतलब और अजगर के बीच कोई अंतर नहीं देख सका। इस प्रकार दो आज्ञा

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

रैंक 2 (दो आयाम) के मैट्रिक्स के लिए वास्तव में बराबर हैं।


जब आप इनपुट मैट्रिक्स की तुलना में अधिक आयामों पर पुनरावृत्ति / टाइलिंग के लिए पूछते हैं तो मामले प्रति-सहज होते हैं। रैंक दो और मैट्रिक्स 2x3 के मैट्रिक्स एम पर वापस जाना, यह देखने के लिए पर्याप्त है कि आउटपुट मैट्रिक्स के आकार / आकार का क्या होता है। मान लें कि हेरफेर के लिए अनुक्रम अब 1,1,2 है।

मतलाब में

> size(repmat(M,1,1,2))
ans =

    2   3   2

इसने इनपुट मैट्रिक्स के पहले दो आयामों (पंक्तियों और स्तंभों) को कॉपी किया है और दोहराया है कि एक बार एक नए तीसरे आयाम (दो बार कॉपी किया गया, वह)। repmatदोहराए जाने वाले मैट्रिक्स के नामकरण के लिए सही है ।

पायथन में

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

इसने एक अलग प्रक्रिया लागू की है, मैं मानता हूं, अनुक्रम (1,1,2) को मतलाब की तुलना में अलग तरीके से पढ़ा जाता है। कॉलम, पंक्तियों और आउट-ऑफ-प्लेन आयाम की दिशा में प्रतियों की संख्या को दाईं से बाईं ओर पढ़ा जा रहा है। परिणामी वस्तु का माटलब से भिन्न आकार होता है। कोई अब उस पर जोर नहीं दे सकता है repmatऔर tileसमान निर्देश हैं।


tileजैसे व्यवहार करने के लिए repmat, पायथन में एक को यह सुनिश्चित करना होता है कि इनपुट मैट्रिक्स में उतने ही आयाम हैं जितने कि तत्व अनुक्रम में हैं। यह किया जाता है, उदाहरण के लिए, थोड़ा पूर्व शर्त करके और संबंधित वस्तु एन बनाकर

N = M[:,:,np.newaxis]

फिर, इनपुट पक्ष में एक के N.shape = (2,3,1)बजाय M.shape = (2,3)और आउटपुट पक्ष पर है

>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)

जिसका उत्तर था size(repmat(M,1,1,2))। मुझे लगता है कि यह इसलिए है क्योंकि हमने पायथन को इसके बाईं ओर के बजाय (2,3) के तीसरे आयाम को जोड़ने के लिए निर्देशित किया है, ताकि पायथन अनुक्रम (1,1,2) के रूप में कार्य करता है जैसा कि मतलब में इरादा था इसे पढ़ने का तरीका।

में तत्व [:,:,0]के लिए अजगर जवाब में एन तत्व के रूप में एक ही मान शामिल होंगे (:,:,1)के लिए Matlab जवाब एम


अंत में, repmatजब कोई क्रोनकर उत्पाद का उपयोग करता है , तो मैं उसके बराबर नहीं मिल सकता

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

जब तक कि मैं तो पूर्व शर्त एम में एन ऊपर के रूप में। इसलिए मेरा तर्क है कि आगे बढ़ने का सबसे सामान्य तरीका तरीकों का उपयोग करना है np.newaxis


जब हम रैंक 3 (तीन आयामों) के मैट्रिक्स L और आउटपुट मैट्रिक्स में कोई नए आयाम नहीं जोड़ने के सरल मामले पर विचार करते हैं, तो गेम ट्रिक हो जाता है । ये दो समान रूप से समान निर्देश समान परिणाम नहीं देंगे

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

क्योंकि पंक्ति, स्तंभ, आउट-ऑफ-प्लेन दिशाएँ हैं (p, q, r) मतलब में और (q, r, p) पायथन में, जो रैंक -2 सरणियों के साथ दिखाई नहीं देता था। वहाँ, एक को सावधान रहना होगा और दो भाषाओं के साथ समान परिणाम प्राप्त करने के लिए अधिक पूर्व शर्त की आवश्यकता होगी।


मुझे पता है कि यह तर्क सामान्य रूप से ठीक नहीं हो सकता है, लेकिन मैं इसे केवल इसी से दूर कर सकता हूं। उम्मीद है कि यह अन्य साथियों को इसे कठिन परीक्षा के लिए आमंत्रित करता है।



1

numpy.matlib में मैटलैब फ़ंक्शन के समान इंटरफ़ेस के साथ एक repmat फ़ंक्शन है

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)

0
>>> import numpy as np

>>> np.repeat(['a','b'], [2,5])

array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1')

>>> np.repeat([1,2], [2,5])

array([1, 1, 2, 2, 2, 2, 2])

>>> np.repeat(np.array([1,2]), [3]).reshape(2,3)

array([[1, 1, 1],
       [2, 2, 2]])

>>> np.repeat(np.array([1,2]), [2,4]).reshape(3,2)

array([[1, 1],
       [2, 2],
       [2, 2]])

>>> np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2)

matrix([[1, 1],
        [2, 2],
        [3, 3],
        [4, 4]])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.