Tujuannya meshgrid
adalah untuk membuat kotak persegi panjang dari array nilai x dan array nilai y.
Jadi, misalnya, jika kita ingin membuat kisi di mana kita memiliki titik pada setiap nilai integer antara 0 dan 4 di kedua arah x dan y. Untuk membuat kisi persegi panjang, kita membutuhkan setiap kombinasi dari x
dan y
titik.
Ini akan menjadi 25 poin, bukan? Jadi jika kita ingin membuat array x dan y untuk semua poin ini, kita bisa melakukan hal berikut.
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
Ini akan menghasilkan berikut x
dan y
matriks, sehingga pasangan elemen yang sesuai dalam setiap matriks memberikan koordinat x dan y dari suatu titik dalam kisi.
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
Kami kemudian dapat merencanakan ini untuk memverifikasi bahwa itu adalah kisi:
plt.plot(x,y, marker='.', color='k', linestyle='none')
Jelas, ini menjadi sangat membosankan terutama untuk rentang besar x
dan y
. Sebaliknya, meshgrid
sebenarnya dapat menghasilkan ini untuk kita: yang harus kita tentukan adalah unik x
dan y
nilai.
xvalues = np.array([0, 1, 2, 3, 4]);
yvalues = np.array([0, 1, 2, 3, 4]);
Sekarang, ketika kita menelepon meshgrid
, kita mendapatkan output sebelumnya secara otomatis.
xx, yy = np.meshgrid(xvalues, yvalues)
plt.plot(xx, yy, marker='.', color='k', linestyle='none')
Pembuatan kisi-kisi persegi panjang ini berguna untuk sejumlah tugas. Dalam contoh yang Anda berikan di pos Anda, itu hanyalah cara untuk mengambil contoh fungsi ( sin(x**2 + y**2) / (x**2 + y**2)
) pada rentang nilai untuk x
dan y
.
Karena fungsi ini telah diambil sampelnya pada kotak persegi panjang, fungsi tersebut sekarang dapat divisualisasikan sebagai "gambar".
Selain itu, hasilnya sekarang dapat diteruskan ke fungsi yang mengharapkan data pada kotak persegi panjang (yaitu contourf
)
xx
danyy
. Bagian misterius bagi saya adalah mengapa mengembalikan hasil, dan seperti apa hasilnya. Jawaban Hai Phan berguna untuk itu. Saya kira itu melakukan itu untuk kenyamanan, karena plot ingin dua parameter seperti itu.xx = [xvalues for y in yvalues]
yy = [[y for x in xvalues] for y in yvalues]
x
dany
mundur Anda? Ketika Anda melakukannyaxx, yy = np.meshgrid(np.arange(4), np.arange(4))
, itu adalah kebalikan dari apa yang Anda milikix
dany
di bagian pertama dari jawabannya. Ini cocok dengan urutan output untukmgrid
, tetapi tidak meshgrid. Thexx
harus meningkat di x-arah, tetapi Anda meningkat ke arah y.Atas perkenan Microsoft Excel:
sumber
XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
np.vstack([XX.ravel(), YY.ravel()]).T
Sebenarnya tujuan
np.meshgrid
sudah disebutkan dalam dokumentasi:Jadi tujuan utamanya adalah untuk membuat matriks koordinat.
Anda mungkin bertanya pada diri sendiri:
Mengapa kita perlu membuat matriks koordinat?
Alasan Anda memerlukan koordinat matriks dengan Python / NumPy adalah bahwa tidak ada hubungan langsung dari koordinat ke nilai, kecuali ketika koordinat Anda mulai dengan nol dan bilangan bulat murni positif. Kemudian Anda bisa menggunakan indeks array sebagai indeks. Namun ketika itu tidak terjadi, Anda harus menyimpan koordinat di samping data Anda. Di situlah grid masuk.
Misalkan data Anda adalah:
Namun, setiap nilai mewakili wilayah lebar 2 kilometer secara horizontal dan 3 kilometer secara vertikal. Misalkan asal Anda adalah sudut kiri atas dan Anda ingin array yang mewakili jarak yang dapat Anda gunakan:
dimana v adalah:
dan H:
Jadi jika Anda memiliki dua indeks, katakanlah
x
dany
(itu sebabnya nilai balikmeshgrid
biasanyaxx
atauxs
bukanx
dalam kasus ini saya pilihh
secara horizontal!) Maka Anda bisa mendapatkan koordinat x titik, koordinat y titik dan nilai pada titik itu dengan menggunakan:Itu membuatnya jauh lebih mudah untuk melacak koordinat dan (bahkan lebih penting) Anda dapat meneruskannya ke fungsi yang perlu mengetahui koordinat.
Penjelasan yang sedikit lebih panjang
Namun,
np.meshgrid
itu sendiri tidak sering digunakan secara langsung, sebagian besar hanya menggunakan salah satu objek yang serupanp.mgrid
ataunp.ogrid
. Berikutnp.mgrid
merupakansparse=False
dannp.ogrid
parasparse=True
kasus (saya merujuk padasparse
argumennp.meshgrid
). Perhatikan bahwa ada perbedaan yang signifikan antaranp.meshgrid
dannp.ogrid
dannp.mgrid
: Dua nilai pertama yang dikembalikan (jika ada dua atau lebih) dibalik. Seringkali ini tidak masalah tetapi Anda harus memberikan nama variabel yang bermakna tergantung pada konteksnya.Sebagai contoh, dalam kasus grid 2D dan
matplotlib.pyplot.imshow
masuk akal untuk memberi nama item yang dikembalikan pertamanp.meshgrid
x
dan yang keduay
sementara itu sebaliknya untuknp.mgrid
dannp.ogrid
.np.ogrid
dan grid yang jarangSeperti yang sudah dikatakan, outputnya terbalik jika dibandingkan dengan
np.meshgrid
, itu sebabnya saya membukanya sebagaiyy, xx
gantixx, yy
:Ini sudah terlihat seperti koordinat, khususnya garis x dan y untuk plot 2D.
Divisualisasikan:
np.mgrid
dan grid padat / disempurnakanHal yang sama berlaku di sini: Output dibalik dibandingkan dengan
np.meshgrid
:Berbeda dengan
ogrid
array ini mengandung semuaxx
danyy
koordinat di -5 <= xx <= 5; -5 <= yy <= 5 kisi.Kegunaan
Ini tidak hanya terbatas pada 2D, fungsi-fungsi ini berfungsi untuk dimensi arbitrer (well, ada jumlah maksimum argumen yang diberikan untuk berfungsi dalam Python dan jumlah maksimum dimensi yang memungkinkan NumPy memungkinkan):
Bahkan jika ini juga bekerja untuk 1D ada dua (1 lebih banyak) fungsi pembuatan grid 1D:
np.arange
np.linspace
Selain
start
danstop
argumen itu juga mendukungstep
argumen (bahkan langkah-langkah rumit yang mewakili jumlah langkah):Aplikasi
Anda secara khusus bertanya tentang tujuan dan pada kenyataannya, kisi-kisi ini sangat berguna jika Anda memerlukan sistem koordinat.
Misalnya jika Anda memiliki fungsi NumPy yang menghitung jarak dalam dua dimensi:
Dan Anda ingin tahu jarak setiap titik:
Outputnya akan sama jika seseorang lewat di grid padat bukannya grid terbuka. Penyiaran NumPys memungkinkan!
Mari kita visualisasikan hasilnya:
Dan ini juga saat NumPys
mgrid
danogrid
menjadi sangat nyaman karena memungkinkan Anda untuk dengan mudah mengubah resolusi grid Anda:Namun, karena
imshow
tidak mendukungx
dany
input, Anda harus mengubah kutu dengan tangan. Akan sangat nyaman jika akan menerimax
dany
mengoordinasikan, kan?Sangat mudah untuk menulis fungsi dengan NumPy yang secara alami berurusan dengan kisi. Selain itu, ada beberapa fungsi di NumPy, SciPy, matplotlib yang mengharapkan Anda untuk lulus dalam grid.
Saya suka gambar jadi mari kita jelajahi
matplotlib.pyplot.contour
:Perhatikan bagaimana koordinat sudah diatur dengan benar! Itu tidak akan terjadi jika Anda baru saja lewat di
density
.Atau untuk memberikan contoh lain yang menyenangkan menggunakan model astropi (kali ini saya tidak terlalu peduli dengan koordinat, saya hanya menggunakannya untuk membuat beberapa kotak):
Meskipun itu hanya "untuk penampilan" beberapa fungsi yang berkaitan dengan model fungsional dan pemasangan (misalnya
scipy.interpolate.interp2d
,scipy.interpolate.griddata
bahkan menunjukkan contoh menggunakannp.mgrid
) dalam Scipy, dll memerlukan grid. Sebagian besar bekerja dengan grid terbuka dan grid padat, namun beberapa hanya bekerja dengan salah satunya.sumber
h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)
- karena 2 km horizontal dan 3km vertikal, bukankah rentang pertama dikalikan 2 dan kedua dengan 3?Misalkan Anda memiliki fungsi:
dan Anda ingin, misalnya, untuk melihat seperti apa dalam rentang 0 hingga 2 * pi. Bagaimana Anda melakukannya? Ada
np.meshgrid
datang dalam:dan plot seperti itu akan terlihat seperti:
Begitu
np.meshgrid
juga kenyamanan. Pada prinsipnya hal yang sama dapat dilakukan oleh:tetapi di sana Anda perlu menyadari dimensi Anda (misalkan Anda memiliki lebih dari dua ...) dan penyiaran yang tepat.
np.meshgrid
melakukan semua ini untukmu.Juga meshgrid memungkinkan Anda untuk menghapus koordinat bersama dengan data jika Anda, misalnya, ingin melakukan interpolasi tetapi mengecualikan nilai-nilai tertentu:
jadi bagaimana Anda melakukan interpolasi sekarang? Anda dapat memberi
x
dany
ke fungsi interpolasi sepertiscipy.interpolate.interp2d
sehingga Anda perlu cara untuk mengetahui koordinat mana yang dihapus:dan kemudian Anda masih dapat menginterpolasi dengan koordinat "benar" (coba tanpa meshgrid dan Anda akan memiliki banyak kode tambahan):
dan meshgrid asli memungkinkan Anda untuk mendapatkan interpolasi di grid asli lagi:
Ini hanya beberapa contoh di mana saya menggunakan
meshgrid
mungkin ada lebih banyak.sumber
xx
,yy
. Sulit untuk memahami apa itu dan mengapa kami menggunakannya untuk menghitung fungsinya. Sepertinya, saya mengerti. Kami ingin menghitung beberapa fungsi berdasarkan koordinat. Kita dapat menulis sesuatu seperti ini:for x=1:10: for y=1:10: z[x,y]=sin(x)+sin(y)
Sebaliknya kita menghitungz
dengan cara yang berbedaz=sin([x,x,...,x]) + sin([y,y,..y])
. Perbaiki saya jika saya salah!numpy
mengarsipkannya dengan : meshgrid atau broadcasting. Jika Anda tidak membuang poin (lihat bagian terakhir dari jawaban saya) keduanya sebenarnya setara secara fungsional. Penyiaran hanyalah sebuah loop implisit melintasi dimensi yang akan disiarkan. Perhatikan bahwa saya menggunakan[:,None]
dan[None, :]
memasukkan dimensi ekstra sehingga hasilnya disiarkan dengan benar. Contoh kedua Anda lebih seperti:sin([[y],[y],..[y]])
interpolated_grid = interpolated(xx, yy)
- ini tidak bekerja untuk saya, kesalahan:x and y should both be 1-D arrays
meshgrid membantu dalam membuat kotak persegi panjang dari dua array 1-D dari semua pasangan titik dari dua array.
Sekarang, jika Anda telah mendefinisikan fungsi f (x, y) dan Anda ingin menerapkan fungsi ini ke semua kemungkinan kombinasi titik dari array 'x' dan 'y', maka Anda dapat melakukan ini:
Katakanlah, jika fungsi Anda hanya menghasilkan produk dari dua elemen, maka ini adalah bagaimana produk kartesius dapat dicapai, secara efisien untuk array besar.
Dirujuk dari sini
sumber
Ide dasar
Diberi kemungkinan nilai x
xs
,, (anggap sebagai tanda centang pada sumbu x plot) dan nilai y yang mungkinys
,,meshgrid
menghasilkan himpunan titik (x, y) grid yang sesuai --- dianalogikan denganset((x, y) for x in xs for y in yx)
. Misalnya, jikaxs=[1,2,3]
danys=[4,5,6]
, kami akan mendapatkan set koordinat{(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}
.Bentuk Nilai Pengembalian
Namun, representasi yang
meshgrid
mengembalikan berbeda dari ekspresi di atas dalam dua cara:Pertama ,
meshgrid
menjabarkan titik-titik grid dalam array 2d: baris sesuai dengan nilai y yang berbeda, kolom sesuai dengan nilai x yang berbeda --- seperti padalist(list((x, y) for x in xs) for y in ys)
, yang akan memberikan array berikut:Kedua ,
meshgrid
mengembalikan koordinat x dan y secara terpisah (yaitu dalam dua array 2d numpy berbeda):Catatan,
np.meshgrid
juga bisa menghasilkan grid untuk dimensi yang lebih tinggi. Diberi xs, ys, dan zs, Anda akan mendapatkan kembali xcoords, ycoords, zcoords sebagai array 3d.meshgrid
juga mendukung urutan terbalik dari dimensi serta representasi hasil yang jarang.Aplikasi
Mengapa kita menginginkan bentuk keluaran ini?
Menerapkan fungsi di setiap titik di grid: Salah satu motivasi adalah bahwa operator biner seperti (+, -, *, /, **) kelebihan beban untuk array numpy sebagai operasi elementwise. Ini berarti bahwa jika saya memiliki fungsi
def f(x, y): return (x - y) ** 2
yang bekerja pada dua skalar, saya juga dapat menerapkannya pada dua array numpy untuk mendapatkan array hasil elementwise: misalnyaf(xcoords, ycoords)
atauf(*np.meshgrid(xs, ys))
memberikan yang berikut pada contoh di atas:Produk luar dimensi yang lebih tinggi: Saya tidak yakin seberapa efisien ini, tetapi Anda bisa mendapatkan produk luar dimensi tinggi dengan cara ini:
np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0)
.Plot kontur di matplotlib: Saya menemukan
meshgrid
ketika menyelidiki menggambar plot kontur dengan matplotlib untuk merencanakan batas keputusan . Untuk ini, Anda menghasilkan kisi denganmeshgrid
, mengevaluasi fungsi pada setiap titik kisi (misalnya seperti yang ditunjukkan di atas), dan kemudian meneruskan xcoords, ycoords, dan nilai-f yang dihitung (yaitu zcoords) ke dalam fungsi contourf.sumber