পাইথন / নুমপি-র জালগ্রন্থের উদ্দেশ্য কী?


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হ'ল এক্স মানগুলির অ্যারে এবং y মানগুলির একটি অ্যারে থেকে একটি আয়তক্ষেত্রাকার গ্রিড তৈরি করা।

সুতরাং, উদাহরণস্বরূপ, আমরা যদি একটি গ্রিড তৈরি করতে চাই যেখানে আমাদের 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)জন্য বিভিন্ন মানের জন্য একটি ফাংশন ( ) নমুনার উপায় ।xy

যেহেতু এই ফাংশনটি একটি আয়তক্ষেত্রাকার গ্রিডে নমুনা তৈরি করা হয়েছে, ফাংশনটি এখন "চিত্র" হিসাবে ভিজ্যুয়ালাইজ করা যেতে পারে।

এখানে চিত্র বর্ণনা লিখুন

অতিরিক্তভাবে, ফলাফলটি এখন এমন ফাংশনে পাঠানো যেতে পারে যা আয়তক্ষেত্রাকার গ্রিডের (যেমন contourf) ডেটা প্রত্যাশা করে


10
আপনি রিটার্ন মানগুলি xxএবং ব্যাখ্যা করেন নি yy। আমার কাছে রহস্যজনক অংশটি ছিল কেন সেই জুটির ফলাফলটি, এবং তারা দেখতে কেমন তা ফিরিয়ে দেয়। হাই ফানের উত্তরটি তার পক্ষে কার্যকর। আমার ধারণা এটি সুবিধার জন্য এটি করে, যেহেতু প্লট এর মতো দুটি পরামিতি চায়।
nealmcb

2
আমি জানি না - সে কারণেই আমি এই তথ্যটি সন্ধান করছি;) সুতরাং আমি বলছি না এটির কিছু আলাদা হওয়া উচিত। যারা কেবল গ্রহণযোগ্য উত্তরটি পড়েছেন তাদের জন্য আমি কেবলমাত্র একটি অনুপস্থিত তথ্যের উপর আমার সেরা অনুমান সরবরাহ করছি। এবং যদি আপনি চান, আমি প্রস্তাব দিচ্ছি যে আপনার উত্তরটি (যা ইতিমধ্যে খুব সুন্দর - আপনাকে ধন্যবাদ!) আপনি যদি রিটার্নের মানগুলি (হাই যেমন করেছিলেন) ব্যাখ্যা করেন তবে আমাদের আরও কিছুটা বিশৃঙ্খল রয়েছে বলে কিছুটা সম্পূর্ণ হতে পারে।
nealmcb

1
Xx এবং yy এর মানগুলি আরও ভালভাবে বুঝতে, এই দাবিটি বিবেচনা করুন যে নীচের কোডটি আপনাকে এনপি.মেশগ্রিডের মতো একই ফল দেয়:xx = [xvalues for y in yvalues] yy = [[y for x in xvalues] for y in yvalues]
ম্যাট

1
এই উত্তরটি confusing- হয় আপনার প্রথম চিত্রণ নয় xএবং yপিছন? আপনি যখন করেন xx, yy = np.meshgrid(np.arange(4), np.arange(4)), এটি আপনার যা আছে তার বিপরীতে xএবং yউত্তরের প্রথম অংশে। এটি আউটপুটগুলির ক্রমের সাথে মেলে mgridতবে জালগ্রিড নয়। xxএক্স-দিক বৃদ্ধি করা উচিত, কিন্তু Y দিক পুলিশের বাড়ে।
স্কট স্টানিউইকজ

1
@ স্কটস্টানিউইচিজ এই বিষয়টির জন্য ধন্যবাদ যে আমাদের, এখন নিশ্চিত যে আমি কীভাবে এই গোলমালটি করেছি ... আপডেট হয়েছে!
সুয়েভার

249

মাইক্রোসফ্ট এক্সেলের সৌজন্যে: 

এখানে চিত্র বর্ণনা লিখুন


6
খুশী হলাম। FWWW, আপনি মাঝের জোড়গুলির মধ্যে 2 x 12 অ্যারে চান:XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
ডানিস

5
এবং আপনি যদি মাঝের XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
জোড়গুলির

2
চমৎকার উত্তর. মেশগ্রিডের উদ্দেশ্য হ'ল প্রতিটি ম্লান স্থানাঙ্ক ব্যবহার করে একটি গ্রিড তৈরি করা।
ভাল ছেলে

1
আমি যা কিছুটা অদ্ভুত মনে করি তা হ'ল x এবং y মানগুলি ইতিমধ্যে একটি অ্যারেতে যুক্ত হওয়ার পরিবর্তে পৃথকভাবে ফিরে আসে। যদি আমি np.vstack([XX.ravel(), YY.ravel()]).T
তাদেরগুলিতে

64

np.meshgridদস্তাবেজটিতে আসলে এর উদ্দেশ্য ইতিমধ্যে উল্লেখ করা হয়েছে:

np.meshgrid

স্থানাঙ্কী ভেক্টর থেকে সমন্বিত ম্যাট্রিকগুলি ফেরত দিন।

এক-মাত্রিক সমন্বিত অ্যারে এক্স 1, এক্স 2, ..., এক্সএন প্রদত্ত এনডি গ্রিডগুলির উপর এনডি স্কেলারার / ভেক্টর ক্ষেত্রগুলির ভেক্টরাইজড মূল্যায়নের জন্য এনডি সমন্বয়কারী অ্যারেগুলি তৈরি করুন।

সুতরাং এটির প্রাথমিক উদ্দেশ্য একটি সমন্বিত ম্যাট্রিক্স তৈরি করা।

আপনি সম্ভবত নিজেকে জিজ্ঞাসা করেছেন:

কেন আমাদের সমন্বিত ম্যাট্রিক তৈরি করতে হবে?

পাইথন / নুমপির সাথে আপনার সমন্বিত ম্যাট্রিকগুলির কারণ হ'ল স্থানাঙ্কগুলি থেকে মানগুলির সাথে সরাসরি সম্পর্ক নেই, যখন আপনার স্থানাঙ্কগুলি শূন্য দিয়ে শুরু হয় এবং খাঁটি ইতিবাচক পূর্ণসংখ্য হয় are তারপরে আপনি কেবল সূচি হিসাবে কোনও অ্যারের সূচকগুলি ব্যবহার করতে পারেন। তবে যখন এটি না হয় আপনার কোনওভাবে আপনার ডেটার পাশাপাশি স্থানাঙ্কগুলি সঞ্চয় করতে হবে store গ্রিডগুলি এখানে।

মনে করুন আপনার ডেটা হ'ল:

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অনুভূমিকভাবে জন্য!) তারপর আপনি এক্স বিন্দু তুল্য পেতে পারেন, 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]])

এটি ইতিমধ্যে স্থানাঙ্কগুলির মতো দেখায়, 2D প্লটের জন্য বিশেষত 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এই অ্যারেগুলির বিপরীতে -5 <= xx <= 5 এ সমস্ত xx এবং yyস্থানাঙ্ক থাকে ; -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()

এখানে চিত্র বর্ণনা লিখুন

এবং এটি তখনও হয় যখন নুমপিস mgridএবং ogridখুব সুবিধাজনক হয়ে যায় কারণ এটি আপনাকে সহজেই আপনার গ্রিডগুলির রেজোলিউশন পরিবর্তন করতে দেয়:

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

এখানে চিত্র বর্ণনা লিখুন

যাইহোক, যেহেতু imshowসমর্থন করে না xএবং yইনপুটগুলি নিজের হাতে টিকগুলি পরিবর্তন করতে হবে। এটি সত্যিই সুবিধাজনক হবে যদি এটি xএবং yস্থানাঙ্কগুলি গ্রহণ করে , তাই না?

NumPy এর সাথে ফাংশনগুলি লেখা সহজ যা গ্রিডগুলির সাথে প্রাকৃতিকভাবে আচরণ করে। তদুপরি, নম্পপি, সায়পি, ম্যাটপ্ল্লোলিবের বেশ কয়েকটি ফাংশন রয়েছে যা আপনাকে গ্রিডে পাস করার আশা করে।

আমি ছবি পছন্দ করি তাই আসুন ঘুরে দেখি 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

বা অ্যাস্ট্রপি মডেলগুলি ব্যবহার করে অন্য একটি মজাদার উদাহরণ দেওয়ার জন্য ( এবার আমি স্থানাঙ্কগুলির বিষয়ে খুব বেশি যত্নশীল নই, আমি কেবল কয়েকটি গ্রিড তৈরি করতে এগুলি ব্যবহার করি ):

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) সম্পর্কিত বিভিন্ন ফাংশনগুলির জন্য গ্রিড প্রয়োজন। এগুলির বেশিরভাগই খোলা গ্রিড এবং ঘন গ্রিডগুলির সাথে কাজ করে তবে কিছু কিছু কেবল তাদের মধ্যে একটির সাথে কাজ করে।


আমি এই অত্যন্ত বিস্তারিত উত্তরের জন্য একটি বিশাল থানকিউ বলতে চাই। এটা আমার দিন তৈরি।
Jlanger

কোনও প্রশ্নের উত্তর দেওয়ার কী সুন্দর উপায় .... তাই বিস্তারিত। ধন্যবাদ
বিপিন

h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)- যেহেতু এর 2 কিলোমিটার অনুভূমিক এবং 3 কিলোমিটার উল্লম্ব, তাই প্রথম পরিসরটি 2 দিয়ে এবং দ্বিতীয়টি 3 দ্বারা গুণিত করা উচিত নয়?
নিখট

@ নিক্স্ট দুর্ভাগ্যক্রমে এটি এতটা সহজ নয়। উত্তরটির সেই অংশটি আমাকে আবারও পরীক্ষা করতে হবে। এটি ম্যাট্রিক্সের ট্রান্সপোজড ডিসপ্লে এবং বিপরীত সূচকগুলির মধ্যে একটি বাণিজ্য বন্ধ - সাধারণত আপনি প্রথম সূচকটি অনুভূমিক এবং দ্বিতীয় উল্লম্ব হওয়ার প্রত্যাশা করেন তবে প্রদর্শনটি স্থানান্তরিত হবে। তবে এটি বেশিরভাগ ক্ষেত্রেই এমন একটি বিশদ যা আশাবাদী উত্তরটির সারমর্মটিকে অকার্যকর করে না যা গ্রিডগুলির কারণ ব্যাখ্যা করার লক্ষ্যে রয়েছে। তবে আমি ভবিষ্যতের তারিখে এটি সংশোধন করার চেষ্টা করব।
এমসিফার্ট

36

ধরুন আপনার কোনও ফাংশন রয়েছে:

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

এবং আপনি উদাহরণস্বরূপ, এটি 0 থেকে 2 * পিআই এর মধ্যে দেখতে দেখতে দেখতে চান see তুমি এটা কি ভাবে করবে? এখানে 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% সঠিক সিউডো কোড নয়, তবে আমি আশা করি আপনি আমার
বক্তব্যটি

আসলে আপনার সবসময় ডাবল লুপ (আপনার প্রথম কোড) প্রয়োজন। তবে এটিকে numpyসংরক্ষণাগার করার বিভিন্ন উপায় রয়েছে : জালগ্রিড বা সম্প্রচার। আপনি যদি পয়েন্টগুলি বাতিল না করেন (আমার উত্তরের শেষ অংশটি দেখুন) উভয়ই কার্যত সমতুল্য। সম্প্রচারটি হ'ল সম্প্রচারিত মাত্রা জুড়ে কেবল একটি অন্তর্নিহিত লুপ। নোট করুন যে আমি ব্যবহার করেছি [:,None]এবং [None, :]অতিরিক্ত মাত্রাগুলি অন্তর্ভুক্ত করতে যাতে ফলাফলটি সঠিকভাবে সম্প্রচারিত হয়। আপনার দ্বিতীয় উদাহরণটি আরও পছন্দ:sin([[y],[y],..[y]])
এমএসিফার্ট

সত্যিই একটি চমৎকার চিত্রণ। অনেক প্রচেষ্টা করার জন্য ধন্যবাদ।
নাটোরোজ

interpolated_grid = interpolated(xx, yy)- এটি আমার পক্ষে কাজ করে না, ত্রুটি:x and y should both be 1-D arrays
নিকট

4

জালগ্রিড দুটি অ্যারে থেকে সমস্ত জোড়া পয়েন্টের দুটি 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(X, Y) গ্রিড পয়েন্ট --- অনুরূপ সংশ্লিষ্ট সেট উত্পন্ন 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প্রত্যাবর্তন করে তা দুটি উপায়ে উপরের অভিব্যক্তি থেকে আলাদা:

প্রথমত , meshgrid2 ডি অ্যারে গ্রিড পয়েন্টগুলি রাখে: সারিগুলি বিভিন্ন y- মানগুলির সাথে মিলিত হয়, কলামগুলি বিভিন্ন এক্স-মানগুলির সাথে মিল রাখে --- যেমনটি 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)]]

দ্বিতীয়ত , meshgridx এবং y স্থানাঙ্কগুলি পৃথকভাবে প্রদান করে (অর্থাত্ দুটি পৃথক নম্পি 2 ডি অ্যারেতে):

   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উচ্চ মাত্রার জন্য গ্রিডও তৈরি করতে পারে। Xs, ys এবং zs দেওয়া, আপনি 3 ডি অ্যারে হিসাবে এক্সকর্ডস, ইকর্ডস, জিকর্ডস ফিরে পাবেন। 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 তদন্ত করার সময় আমি এসে পৌঁছেছি । এর জন্য, আপনি প্রতিটি গ্রিড পয়েন্টে (যেমন উপরে দেখানো হয়েছে) ফাংশনটি মূল্যায়ন করুন এবং তারপরে এক্সকর্ডস, ইকোর্ডস, এবং গণনা করা এফ-মানগুলি (অর্থাত্ জেককর্ডস) কনট্যুরফ ফাংশনে পাস করুন।meshgrid

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.