पायथन / न्यूमपी में मेशग्रिड का उद्देश्य क्या है?


302

क्या कोई मुझे समझा सकता है कि meshgridनम्पी में कार्य का उद्देश्य क्या है ? मुझे पता है कि यह साजिश रचने के लिए कुछ प्रकार के निर्देशांक बनाता है, लेकिन मैं इसका सीधा लाभ नहीं देख सकता।

मैं सेबेस्टियन रास्का से "पायथन मशीन लर्निंग" का अध्ययन कर रहा हूं, और वह इसका उपयोग निर्णय सीमाओं की साजिश रचने के लिए कर रहा है। इनपुट 11 यहां देखें ।

मैंने आधिकारिक दस्तावेज से भी इस कोड की कोशिश की है, लेकिन, फिर से, आउटपुट वास्तव में मेरे लिए मायने नहीं रखता है।

x = np.arange(-5, 5, 1)
y = np.arange(-5, 5, 1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
h = plt.contourf(x,y,z)

कृपया, यदि संभव हो तो, मुझे वास्तविक दुनिया के कई उदाहरण भी दिखाएं।

जवाबों:


388

इसका उद्देश्य meshgridएक्स मानों की एक सरणी और वाई मूल्यों की एक सरणी से एक आयताकार ग्रिड बनाना है।

इसलिए, उदाहरण के लिए, यदि हम एक ग्रिड बनाना चाहते हैं जहां हमारे पास x और y दोनों दिशाओं में 0 और 4 के बीच प्रत्येक पूर्णांक मान पर एक बिंदु हो। एक आयताकार ग्रिड बनाने के लिए, हमें xऔर yबिंदुओं के हर संयोजन की आवश्यकता है ।

यह 25 अंक होने जा रहा है, है ना? इसलिए यदि हम इन सभी बिंदुओं के लिए एक x और y सरणी बनाना चाहते हैं, तो हम निम्नलिखित कर सकते हैं।

x[0,0] = 0    y[0,0] = 0
x[0,1] = 1    y[0,1] = 0
x[0,2] = 2    y[0,2] = 0
x[0,3] = 3    y[0,3] = 0
x[0,4] = 4    y[0,4] = 0
x[1,0] = 0    y[1,0] = 1
x[1,1] = 1    y[1,1] = 1
...
x[4,3] = 3    y[4,3] = 4
x[4,4] = 4    y[4,4] = 4

यह निम्नलिखित xऔर yमैट्रिसेस में परिणत होगा , जैसे कि प्रत्येक मैट्रिक्स में संबंधित तत्व की जोड़ी ग्रिड में एक बिंदु के x और y निर्देशांक देता है।

x =   0 1 2 3 4        y =   0 0 0 0 0
      0 1 2 3 4              1 1 1 1 1
      0 1 2 3 4              2 2 2 2 2
      0 1 2 3 4              3 3 3 3 3
      0 1 2 3 4              4 4 4 4 4

इसके बाद हम पुष्टि कर सकते हैं कि वे एक ग्रिड हैं:

plt.plot(x,y, marker='.', color='k', linestyle='none')

यहां छवि विवरण दर्ज करें

जाहिर है, यह विशेष रूप से xऔर बड़ी रेंज के लिए बहुत थकाऊ हो जाता है y। इसके बजाय, meshgridवास्तव में यह हमारे लिए उत्पन्न कर सकता है: हम सभी को निर्दिष्ट करने के लिए अद्वितीय xऔर yमूल्य हैं।

xvalues = np.array([0, 1, 2, 3, 4]);
yvalues = np.array([0, 1, 2, 3, 4]);

अब, जब हम कॉल करते हैं, तो हम meshgridपिछले आउटपुट को स्वचालित रूप से प्राप्त करते हैं।

xx, yy = np.meshgrid(xvalues, yvalues)

plt.plot(xx, yy, marker='.', color='k', linestyle='none')

यहां छवि विवरण दर्ज करें

इन आयताकार ग्रिड का निर्माण कई कार्यों के लिए उपयोगी है। उदाहरण के लिए, जो आपने अपनी पोस्ट में प्रदान किया है, यह एक फ़ंक्शन ( sin(x**2 + y**2) / (x**2 + y**2)) के लिए xऔर मानों की एक सीमा से अधिक का नमूना लेने का एक तरीका है y

क्योंकि इस फ़ंक्शन को एक आयताकार ग्रिड पर नमूना किया गया है, अब फ़ंक्शन को "छवि" के रूप में देखा जा सकता है।

यहां छवि विवरण दर्ज करें

इसके अतिरिक्त, परिणाम अब उन कार्यों को पारित किया जा सकता है जो आयताकार ग्रिड पर डेटा की उम्मीद करते हैं (यानी contourf)


10
आप वापसी मान नहीं समझाया है xxऔर yy। मेरे लिए रहस्यमयी बात यह थी कि परिणाम की उस जोड़ी को वह क्यों लौटाता है, और वे क्या दिखते हैं। उसके लिए है फान का जवाब आसान है। मुझे लगता है कि यह सुविधा के लिए करता है, क्योंकि प्लॉट उस तरह के दो मापदंडों को चाहता है।
nealmcb

2
मुझे नहीं पता - इसीलिए मैं यह जानकारी देख रहा हूं;) इसलिए मैं यह नहीं कह रहा हूं कि इसे कुछ अलग करना चाहिए। मैं सिर्फ उन लोगों के लिए जानकारी के एक अनुपस्थित टुकड़े पर अपना सर्वश्रेष्ठ अनुमान प्रदान कर रहा हूं जो सिर्फ स्वीकृत उत्तर को पढ़ते हैं। और अगर आपको पसंद है, तो मैं सुझाव दे रहा हूं कि आपका उत्तर (जो पहले से ही बहुत अच्छा है - धन्यवाद!) यदि आप रिटर्न मानों (जैसे कि किया था) के बारे में थोड़ा और अधिक पूरा करेंगे, तो हममें से जो अभी भी हैरान हैं।
nealmcb

1
Xx और yy के मूल्यों को बेहतर ढंग से समझने के लिए, इस दावे पर विचार करें कि निम्न कोड आपको np.meshgrid के समान परिणाम प्राप्त करता है:xx = [xvalues for y in yvalues] yy = [[y for x in xvalues] for y in yvalues]
मैट क्लेनिस्मिथ

1
यह उत्तर भ्रमित करने वाला है- क्या आपका पहला चित्रण पीछे xऔर yपीछे की ओर नहीं है? जब आप करते हैं xx, yy = np.meshgrid(np.arange(4), np.arange(4)), तो यह आपके पास है जो आपके पास है xऔर yउत्तर के पहले भाग में है। यह आउटपुट के ऑर्डर से मेल खाता है mgrid, लेकिन मेशग्रिड नहीं। xxएक्स-दिशा में बढ़ रही है होना चाहिए, लेकिन y दिशा में तुम्हारा बढ़ जाती है।
स्कॉट स्टैन्विकेज़

1
@ScottStaniewicz यह इंगित करने के लिए धन्यवाद कि हमारे, अब मुझे यकीन है कि मैंने कैसे गड़बड़ कर दिया ... अपडेट किया गया!
स्वेवर

249

Microsoft Excel का सौजन्य: 

यहां छवि विवरण दर्ज करें


6
अच्छा लगा। Fwiw, यदि आप बीच में जोड़े के 2 x 12 सरणी चाहते हैं:XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
डेनिस

5
और यदि आप बीच में जोड़े की 12 x 2 सरणी चाहते हैं:XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
barlaensdoonn

2
अच्छा उत्तर। मेशग्रीड का उद्देश्य प्रत्येक मंद के समन्वय का उपयोग करके एक ग्रिड बनाना है।
अच्छा लड़का

1
मुझे जो थोड़ा अजीब लगता है वह यह है कि पहले से ही एक एरे में संयुक्त होने के बजाय एक्स और वाई मूल्यों को अलग-अलग लौटाया जाता है। यदि मैं उन्हें एक सरणी में चाहता हूं, तो मुझे करने की आवश्यकता है:np.vstack([XX.ravel(), YY.ravel()]).T
user3629892

64

वास्तव में इसका उद्देश्य np.meshgridपहले से ही प्रलेखन में उल्लिखित है:

np.meshgrid

समन्वय वैक्टर से रिटर्न समन्वय मैट्रिसेस।

एनडी स्केलर / वेक्टर क्षेत्रों के एनडी ग्रिडों के वेक्टरकृत मूल्यांकन के लिए एनडी समन्वय सारणी बनाएं, एक आयामी समन्वय एरे, एक्स 2, ..., एक्सएन को देखते हुए।

तो यह प्राथमिक उद्देश्य एक निर्देशांक matrices बनाने के लिए है।

आपने शायद खुद से पूछा:

हमें समन्वय मेट्रिसेस बनाने की आवश्यकता क्यों है?

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

मान लीजिए कि आपका डेटा है:

1  2  1
2  5  2
1  2  1

हालाँकि, प्रत्येक मान 2 किलोमीटर चौड़े क्षेत्र को क्षैतिज रूप से और 3 किलोमीटर लंबवत रूप से दर्शाता है। मान लीजिए कि आपका मूल ऊपरी बाएँ कोने में है और आप ऐसी सरणियाँ चाहते हैं जो आपके द्वारा उपयोग की जा सकने वाली दूरी का प्रतिनिधित्व करें:

import numpy as np
h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)

वी कहाँ है:

array([[0, 0, 0],
       [2, 2, 2],
       [4, 4, 4]])

और वह:

array([[0, 3, 6],
       [0, 3, 6],
       [0, 3, 6]])

इसलिए यदि आपके पास दो सूचकांक हैं, तो आइए कहते हैं xऔर y(इसीलिए कि वापसी का मूल्य meshgridआमतौर पर है xxया xsइसके बजाय xइस मामले में मैंने hक्षैतिज रूप से चुना है!) तो आप बिंदु के x निर्देशांक, बिंदु के y निर्देशांक प्राप्त कर सकते हैं! उस बिंदु पर मूल्य का उपयोग करके:

h[x, y]    # horizontal coordinate
v[x, y]    # vertical coordinate
data[x, y]  # value

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

थोड़ा लंबा स्पष्टीकरण

हालांकि, np.meshgridखुद को अक्सर सीधे इस्तेमाल नहीं किया जाता है, ज्यादातर एक समान वस्तुओं का उपयोग करता है np.mgridया np.ogrid। यहाँ np.mgridका प्रतिनिधित्व करता है sparse=Falseऔर मामले (मैं का उल्लेख का तर्क )। ध्यान दें कि और : के बीच एक महत्वपूर्ण अंतर है और पहले दो लौटे मान (यदि दो या अधिक हैं) उलट हैं। अक्सर यह मायने नहीं रखता है, लेकिन आपको संदर्भ के आधार पर सार्थक चर नाम देना चाहिए।np.ogridsparse=Truesparsenp.meshgridnp.meshgridnp.ogridnp.mgrid

उदाहरण के लिए, एक 2 डी ग्रिड के मामले में और matplotlib.pyplot.imshowयह समझ में आता है के पहले लौटे आइटम नाम के लिए np.meshgrid xऔर दूसरा एक y, जबकि इसके लिए दूसरी तरह के आसपास है np.mgridऔर np.ogrid

np.ogrid और विरल ग्रिड

>>> import numpy as np
>>> yy, xx = np.ogrid[-5:6, -5:6]
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5],
       [-4],
       [-3],
       [-2],
       [-1],
       [ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5]])

जैसा कि पहले ही कहा जा सकता है np.meshgridकि जब इसकी तुलना में आउटपुट उल्टा हो जाता है , इसीलिए मैंने इसे yy, xxइसके बजाय अनपैक कर दिया है xx, yy:

>>> xx, yy = np.meshgrid(np.arange(-5, 6), np.arange(-5, 6), sparse=True)
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5],
       [-4],
       [-3],
       [-2],
       [-1],
       [ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5]])

यह पहले से ही निर्देशांक की तरह दिखता है, विशेष रूप से 2 डी भूखंडों के लिए x और y लाइनें।

कल्पना:

yy, xx = np.ogrid[-5:6, -5:6]
plt.figure()
plt.title('ogrid (sparse meshgrid)')
plt.grid()
plt.xticks(xx.ravel())
plt.yticks(yy.ravel())
plt.scatter(xx, np.zeros_like(xx), color="blue", marker="*")
plt.scatter(np.zeros_like(yy), yy, color="red", marker="x")

यहां छवि विवरण दर्ज करें

np.mgrid और घने / मांस से बाहर ग्रिड

>>> yy, xx = np.mgrid[-5:6, -5:6]
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5],
       [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4],
       [-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3],
       [-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
       [ 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3],
       [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4],
       [ 5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5]])

यहां भी यही बात लागू होती है: आउटपुट की तुलना में उल्टा होता है np.meshgrid:

>>> xx, yy = np.meshgrid(np.arange(-5, 6), np.arange(-5, 6))
>>> xx
array([[-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5],
       [-5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5]])
>>> yy
array([[-5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5],
       [-4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4],
       [-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3],
       [-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
       [ 2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2],
       [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3],
       [ 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4],
       [ 5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5]])

ogridइन सरणियों के विपरीत सभी होते हैंxx और yy-5 <= xx <= 5 में निर्देशांक होते हैं ; -5 <= yy <= 5 ग्रिड।

yy, xx = np.mgrid[-5:6, -5:6]
plt.figure()
plt.title('mgrid (dense meshgrid)')
plt.grid()
plt.xticks(xx[0])
plt.yticks(yy[:, 0])
plt.scatter(xx, yy, color="red", marker="x")

यहां छवि विवरण दर्ज करें

कार्यक्षमता

यह केवल 2 डी तक सीमित नहीं है, ये कार्य मनमाने आयामों के लिए काम करते हैं (ठीक है, पायथन में कार्य करने के लिए दिए गए तर्कों की अधिकतम संख्या है और अधिकतम संख्या में आयाम जो कि NumPy अनुमति देता है):

>>> x1, x2, x3, x4 = np.ogrid[:3, 1:4, 2:5, 3:6]
>>> for i, x in enumerate([x1, x2, x3, x4]):
...     print('x{}'.format(i+1))
...     print(repr(x))
x1
array([[[[0]]],


       [[[1]]],


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

        [[2]],

        [[3]]]])
x3
array([[[[2],
         [3],
         [4]]]])
x4
array([[[[3, 4, 5]]]])

>>> # equivalent meshgrid output, note how the first two arguments are reversed and the unpacking
>>> x2, x1, x3, x4 = np.meshgrid(np.arange(1,4), np.arange(3), np.arange(2, 5), np.arange(3, 6), sparse=True)
>>> for i, x in enumerate([x1, x2, x3, x4]):
...     print('x{}'.format(i+1))
...     print(repr(x))
# Identical output so it's omitted here.

अगर ये 1 डी के लिए भी काम करते हैं तो भी दो (बहुत अधिक सामान्य) 1 डी ग्रिड निर्माण कार्य हैं:

तर्क startऔर stopतर्क के अलावा यह तर्क का समर्थन भी करता stepहै (यहां तक ​​कि जटिल कदम जो चरणों की संख्या का प्रतिनिधित्व करते हैं):

>>> x1, x2 = np.mgrid[1:10:2, 1:10:4j]
>>> x1  # The dimension with the explicit step width of 2
array([[1., 1., 1., 1.],
       [3., 3., 3., 3.],
       [5., 5., 5., 5.],
       [7., 7., 7., 7.],
       [9., 9., 9., 9.]])
>>> x2  # The dimension with the "number of steps"
array([[ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.],
       [ 1.,  4.,  7., 10.]])

अनुप्रयोग

आपने विशेष रूप से उद्देश्य के बारे में पूछा है और वास्तव में, ये ग्रिड अत्यंत उपयोगी हैं यदि आपको एक समन्वय प्रणाली की आवश्यकता है।

उदाहरण के लिए यदि आपके पास एक NumPy फ़ंक्शन है जो दो आयामों में दूरी की गणना करता है:

def distance_2d(x_point, y_point, x, y):
    return np.hypot(x-x_point, y-y_point)

और आप प्रत्येक बिंदु की दूरी जानना चाहते हैं:

>>> ys, xs = np.ogrid[-5:5, -5:5]
>>> distances = distance_2d(1, 2, xs, ys)  # distance to point (1, 2)
>>> distances
array([[9.21954446, 8.60232527, 8.06225775, 7.61577311, 7.28010989,
        7.07106781, 7.        , 7.07106781, 7.28010989, 7.61577311],
       [8.48528137, 7.81024968, 7.21110255, 6.70820393, 6.32455532,
        6.08276253, 6.        , 6.08276253, 6.32455532, 6.70820393],
       [7.81024968, 7.07106781, 6.40312424, 5.83095189, 5.38516481,
        5.09901951, 5.        , 5.09901951, 5.38516481, 5.83095189],
       [7.21110255, 6.40312424, 5.65685425, 5.        , 4.47213595,
        4.12310563, 4.        , 4.12310563, 4.47213595, 5.        ],
       [6.70820393, 5.83095189, 5.        , 4.24264069, 3.60555128,
        3.16227766, 3.        , 3.16227766, 3.60555128, 4.24264069],
       [6.32455532, 5.38516481, 4.47213595, 3.60555128, 2.82842712,
        2.23606798, 2.        , 2.23606798, 2.82842712, 3.60555128],
       [6.08276253, 5.09901951, 4.12310563, 3.16227766, 2.23606798,
        1.41421356, 1.        , 1.41421356, 2.23606798, 3.16227766],
       [6.        , 5.        , 4.        , 3.        , 2.        ,
        1.        , 0.        , 1.        , 2.        , 3.        ],
       [6.08276253, 5.09901951, 4.12310563, 3.16227766, 2.23606798,
        1.41421356, 1.        , 1.41421356, 2.23606798, 3.16227766],
       [6.32455532, 5.38516481, 4.47213595, 3.60555128, 2.82842712,
        2.23606798, 2.        , 2.23606798, 2.82842712, 3.60555128]])

आउटपुट एक समान होगा यदि कोई खुली ग्रिड के बजाय एक घने ग्रिड में पारित हो गया। NumPys प्रसारण संभव बनाता है!

आइए परिणाम की कल्पना करें:

plt.figure()
plt.title('distance to point (1, 2)')
plt.imshow(distances, origin='lower', interpolation="none")
plt.xticks(np.arange(xs.shape[1]), xs.ravel())  # need to set the ticks manually
plt.yticks(np.arange(ys.shape[0]), ys.ravel())
plt.colorbar()

यहां छवि विवरण दर्ज करें

और यह तब भी है जब NumPys mgridऔर ogridबहुत सुविधाजनक हो जाते हैं क्योंकि यह आपको आसानी से अपने ग्रिड के रिज़ॉल्यूशन को बदलने की अनुमति देता है:

ys, xs = np.ogrid[-5:5:200j, -5:5:200j]
# otherwise same code as above

यहां छवि विवरण दर्ज करें

हालाँकि, चूंकि imshowकोई समर्थन xऔर yइनपुट नहीं करता है , इसलिए टिक को हाथ से बदलना होगा। यह वास्तव में सुविधाजनक होगा अगर यह स्वीकार करेगा xऔर yनिर्देशांक करेगा, है ना?

NumPy के साथ फ़ंक्शन लिखना आसान है जो स्वाभाविक रूप से ग्रिड से निपटते हैं। इसके अलावा, NumPy, SciPy, matplotlib में कई कार्य हैं जो आपसे ग्रिड में पास होने की उम्मीद करते हैं।

मुझे चित्र पसंद हैं तो आइए देखें matplotlib.pyplot.contour:

ys, xs = np.mgrid[-5:5:200j, -5:5:200j]
density = np.sin(ys)-np.cos(xs)
plt.figure()
plt.contour(xs, ys, density)

यहां छवि विवरण दर्ज करें

ध्यान दें कि निर्देशांक पहले से ही कैसे सही ढंग से सेट हैं! यदि आप अभी-अभी पास हुए हैं तो ऐसा नहीं होगा density

या इसका उपयोग करते एक और मजेदार उदाहरण देने के लिए astropy मॉडल (इस बार मैं निर्देशांक के बारे में ज्यादा परवाह नहीं है, मैं सिर्फ उन्हें बनाने के लिए उपयोग कुछ ग्रिड):

from astropy.modeling import models
z = np.zeros((100, 100))
y, x = np.mgrid[0:100, 0:100]
for _ in range(10):
    g2d = models.Gaussian2D(amplitude=100, 
                           x_mean=np.random.randint(0, 100), 
                           y_mean=np.random.randint(0, 100), 
                           x_stddev=3, 
                           y_stddev=3)
    z += g2d(x, y)
    a2d = models.AiryDisk2D(amplitude=70, 
                            x_0=np.random.randint(0, 100), 
                            y_0=np.random.randint(0, 100), 
                            radius=5)
    z += a2d(x, y)

यहां छवि विवरण दर्ज करें

हालाँकि यह केवल " दिखावे के लिए" है scipy.interpolate.interp2d, कार्यात्मक मॉडल और फिटिंग से संबंधित कई कार्य (उदाहरण के लिए , scipy.interpolate.griddataयहां तक ​​कि उदाहरणों का उपयोग करके np.mgrid) स्कैपी में, आदि के लिए ग्रिड की आवश्यकता होती है। इनमें से अधिकांश खुले ग्रिड और घने ग्रिड के साथ काम करते हैं, हालांकि कुछ केवल उनमें से एक के साथ काम करते हैं।


मैं केवल इस अत्यंत विस्तृत उत्तर के लिए एक बहुत बड़ा धन्यवाद कहना चाहता हूं। इससे आज मेरा काम बन गया।
जलंगर

किसी प्रश्न का उत्तर देने का कितना सुंदर तरीका .... इतना विस्तृत। धन्यवाद
बिपिन

h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)- इसकी 2 किमी क्षैतिज और 3 किमी ऊर्ध्वाधर के बाद से, पहली श्रेणी को 2 से गुणा नहीं किया जाना चाहिए और 3 से दूसरा?
निक्स

@ निक्स दुर्भाग्य से यह उतना सरल नहीं है। मुझे जवाब के उस हिस्से को फिर से जाँचना पड़ सकता है। यह मैट्रिक्स के ट्रांसपोज़्ड डिस्प्ले और उल्टे इंडेक्सिंग के बीच एक व्यापार-बंद है - आम तौर पर आपको लगता है कि पहला इंडेक्स क्षैतिज और दूसरा वर्टिकल होगा लेकिन फिर डिस्प्ले ट्रांसपोज़ हो जाएगा। हालाँकि यह ज्यादातर एक विवरण है जो उम्मीद है कि उत्तर के सार को अमान्य नहीं करता है जिसका उद्देश्य ग्रिड के कारण को स्पष्ट करना है। लेकिन मैं भविष्य की तारीख में इसे संशोधित करने की कोशिश करूंगा।
MSeifert

36

मान लीजिए कि आपका कोई कार्य है:

def sinus2d(x, y):
    return np.sin(x) + np.sin(y)

और आप चाहते हैं, उदाहरण के लिए, यह देखने के लिए कि यह 0 से 2 * pi की सीमा में कैसा दिखता है। आपको इसे कैसे करना होगा? इसमें np.meshgridआता है:

xx, yy = np.meshgrid(np.linspace(0,2*np.pi,100), np.linspace(0,2*np.pi,100))
z = sinus2d(xx, yy) # Create the image on this grid

और इस तरह की साजिश की तरह दिखेगा:

import matplotlib.pyplot as plt
plt.imshow(z, origin='lower', interpolation='none')
plt.show()

यहां छवि विवरण दर्ज करें

तो np.meshgridबस एक सुविधा है। सिद्धांत रूप में एक ही द्वारा किया जा सकता है:

z2 = sinus2d(np.linspace(0,2*np.pi,100)[:,None], np.linspace(0,2*np.pi,100)[None,:])

लेकिन आपको अपने आयामों के बारे में पता होना चाहिए (मान लीजिए कि आपके पास दो से अधिक हैं ...) और सही प्रसारण। np.meshgridयह सब आपके लिए करता है।

इसके अलावा मेशग्रिड आपको डेटा के साथ समन्वय को हटाने की अनुमति देता है यदि आप, उदाहरण के लिए, एक प्रक्षेप करना चाहते हैं, लेकिन कुछ निश्चित मानों को छोड़कर:

condition = z>0.6
z_new = z[condition] # This will make your array 1D

तो अब आप प्रक्षेप कैसे करेंगे? आप दे सकते हैं xऔर yकी तरह एक प्रक्षेप कार्य करने के लिए scipy.interpolate.interp2dतो आप एक तरह से पता करने के लिए जो निर्देशांक नष्ट कर दिया गया की जरूरत है:

x_new = xx[condition]
y_new = yy[condition]

और फिर आप अभी भी "सही" निर्देशांक के साथ इंटरपोल कर सकते हैं (इसे ट्रेग्रिड के बिना आज़माएं और आपके पास बहुत सारे अतिरिक्त कोड होंगे):

from scipy.interpolate import interp2d
interpolated = interp2d(x_new, y_new, z_new)

और मूल मेशग्रिड आपको मूल ग्रिड पर फिर से प्रक्षेप प्राप्त करने की अनुमति देता है:

interpolated_grid = interpolated(xx[0], yy[:, 0]).reshape(xx.shape)

ये केवल कुछ उदाहरण हैं जहां मैंने meshgridवहां उपयोग किया है और भी बहुत कुछ हो सकता है।


1
आपके उत्तर के लिए धन्यवाद! मेरे लिए सबसे भ्रमित पल मान दिया जाता है xx, yy। यह समझना मुश्किल था कि वे क्या हैं और हम उनका उपयोग फ़ंक्शन की गणना करने के लिए क्यों करते हैं। लगता है, मैं समझ गया। हम निर्देशांक के आधार पर कुछ फ़ंक्शन की गणना करना चाहते हैं। हम कुछ इस तरह लिख सकते हैं: for x=1:10: for y=1:10: z[x,y]=sin(x)+sin(y)इसके बजाय हम zएक अलग तरीके से गणना करते हैं z=sin([x,x,...,x]) + sin([y,y,..y])। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं!
एलेना कोस्टियासुकवेट्स

यह 100% सही छद्म कोड नहीं है, लेकिन मुझे उम्मीद है कि आप मेरी बात देखेंगे)
Alena Kastsiukavets

वास्तव में आपको हमेशा डबल लूप (आपका पहला कोड) की आवश्यकता होती है। लेकिन इसके साथ numpyसंग्रह करने के अलग-अलग तरीके हैं : मेशग्रिड या ब्रॉडकास्टिंग। यदि आप अंक नहीं छोड़ते हैं (मेरे उत्तर का अंतिम भाग देखें) दोनों वास्तव में कार्यात्मक रूप से समकक्ष हैं। प्रसारण केवल प्रसारण के आयाम के पार एक अंतर्निहित लूप है। ध्यान दें कि मैंने उपयोग किया [:,None]और [None, :]अतिरिक्त आयामों को शामिल किया ताकि परिणाम सही ढंग से प्रसारित हो। आपका दूसरा उदाहरण अधिक है:sin([[y],[y],..[y]])
MSeifert

एक बहुत अच्छा चित्रण। इतने प्रयास में लगाने के लिए धन्यवाद।
नेटर्सोज़

interpolated_grid = interpolated(xx, yy)- यह मेरे लिए काम नहीं करता है, त्रुटि:x and y should both be 1-D arrays
Nixt

4

meshgrid दो सरणियों से बिंदुओं के सभी जोड़े के दो 1-डी सरणियों से एक आयताकार ग्रिड बनाने में मदद करता है।

x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 1, 2, 3, 4])

अब, यदि आपने एक फ़ंक्शन f (x, y) को परिभाषित किया है और आप इस फ़ंक्शन को सरणियों 'x' और 'y' से बिंदुओं के सभी संभावित संयोजन पर लागू करना चाहते हैं, तो आप ऐसा कर सकते हैं:

f(*np.meshgrid(x, y))

कहते हैं, यदि आपका कार्य केवल दो तत्वों के उत्पाद का उत्पादन करता है, तो यह है कि बड़े सरणियों के लिए कुशलतापूर्वक एक कार्टेसियन उत्पाद कैसे प्राप्त किया जा सकता है।

यहां से रेफर किया गया


1

मूल विचार

यह देखते हुए संभव एक्स मूल्यों, xs, और संभव y मूल्यों (एक साजिश के x- अक्ष पर टिक के निशान के रूप में उनमें से लगता है), ys, meshgrid(एक्स, वाई) ग्रिड अंक --- के अनुरूप की इसी सेट उत्पन्न करता है set((x, y) for x in xs for y in yx)। उदाहरण के लिए, यदि xs=[1,2,3]और ys=[4,5,6], हम निर्देशांक का सेट प्राप्त करेंगे {(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}

रिटर्न वैल्यू का फॉर्म

हालाँकि, प्रतिनिधित्व जो meshgridदो तरीकों से उपरोक्त अभिव्यक्ति से अलग है:

सबसे पहले , meshgridग्रिड बिंदुओं को 2d सरणी में देता है: पंक्तियाँ अलग-अलग y-मानों के अनुरूप होती हैं, कॉलम अलग-अलग x-मानों के अनुरूप होते हैं --- जैसा कि list(list((x, y) for x in xs) for y in ys), निम्नलिखित सरणी देगा:

   [[(1,4), (2,4), (3,4)],
    [(1,5), (2,5), (3,5)],
    [(1,6), (2,6), (3,6)]]

दूसरा , meshgridएक्स और वाई को अलग-अलग समन्वयित करता है (यानी दो अलग-अलग अलग 2d सरणियों में):

   xcoords, ycoords = (
       array([[1, 2, 3],
              [1, 2, 3],
              [1, 2, 3]]),
       array([[4, 4, 4],
              [5, 5, 5],
              [6, 6, 6]]))
   # same thing using np.meshgrid:
   xcoords, ycoords = np.meshgrid([1,2,3], [4,5,6])
   # same thing without meshgrid:
   xcoords = np.array([xs] * len(ys)
   ycoords = np.array([ys] * len(xs)).T

ध्यान दें, np.meshgridउच्च आयामों के लिए ग्रिड भी बना सकते हैं। X, ys और zs को देखते हुए, आपको xcoords, ycoords, zcoords को 3D सरणियों के रूप में वापस मिलेगा। meshgridआयामों के रिवर्स ऑर्डर के साथ-साथ परिणाम के विरल प्रतिनिधित्व का भी समर्थन करता है।

अनुप्रयोग

हम आउटपुट का यह रूप क्यों चाहते हैं?

ग्रिड पर प्रत्येक बिंदु पर एक फ़ंक्शन लागू करें: एक प्रेरणा यह है कि द्विआधारी ऑपरेटर जैसे (+, -, *, /, **) तत्वपूर्ण संचालन के रूप में संख्यात्मक सरणियों के लिए अतिभारित होते हैं। इसका मतलब यह है कि अगर मेरे पास एक फ़ंक्शन है def f(x, y): return (x - y) ** 2जो दो स्केलर पर काम करता है, तो मैं इसे दो सुन्न सारणी पर भी लागू कर सकता हूं ताकि तत्वों का एक सरणी प्राप्त हो सके: उदाहरण के लिए f(xcoords, ycoords)या f(*np.meshgrid(xs, ys))उपरोक्त उदाहरण पर निम्नलिखित देता है:

array([[ 9,  4,  1],
       [16,  9,  4],
       [25, 16,  9]])

उच्च आयामी बाहरी उत्पाद: मुझे यकीन नहीं है कि यह कितना कुशल है, लेकिन आप इस तरह से उच्च-आयामी बाहरी उत्पाद प्राप्त कर सकते हैं np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0):।

मैटप्लोटलिब में कंटूर प्लॉट: मैं meshgridतब आया था जब निर्णय सीमाओं की साजिश रचने के लिए मैटलपोटलिब के साथ समोच्च भूखंडों की जांच कर रहा था । इसके लिए, आप एक ग्रिड उत्पन्न करते हैं, प्रत्येक ग्रिड बिंदु पर फ़ंक्शन का मूल्यांकन करते हैं (जैसे ऊपर दिखाया गया है), और फिर समोच्च फ़ंक्शन में xcoords, ycoords, और कंप्यूटेड f-values ​​(यानी zcoords) पास करें।meshgrid

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