Celem meshgrid
jest utworzenie prostokątnej siatki z tablicy wartości x i tablicy wartości y.
Na przykład, jeśli chcemy utworzyć siatkę, w której mamy punkt przy każdej wartości całkowitej od 0 do 4 w obu kierunkach xiy. Aby utworzyć prostokątną siatkę, potrzebujemy każdej kombinacji punktów x
i y
.
To będzie 25 punktów, prawda? Więc jeśli chcielibyśmy stworzyć tablicę xiy dla wszystkich tych punktów, moglibyśmy wykonać następujące czynności.
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
Spowodowałoby to następujące x
i y
macierze, tak że parowanie odpowiedniego elementu w każdej macierzy daje współrzędne xiy punktu w siatce.
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
Następnie możemy wykreślić je, aby sprawdzić, czy są siatką:
plt.plot(x,y, marker='.', color='k', linestyle='none')
Oczywiście staje się to bardzo nudne, szczególnie w przypadku dużych zakresów x
i y
. Zamiast tego meshgrid
może faktycznie wygenerować to dla nas: wszystko, co musimy określić, to unikalność x
i y
wartości.
xvalues = np.array([0, 1, 2, 3, 4]);
yvalues = np.array([0, 1, 2, 3, 4]);
Teraz, kiedy dzwonimy meshgrid
, automatycznie uzyskujemy poprzedni wynik.
xx, yy = np.meshgrid(xvalues, yvalues)
plt.plot(xx, yy, marker='.', color='k', linestyle='none')
Tworzenie tych prostokątnych siatek jest przydatne do wielu zadań. W przykładzie podanym w poście jest to po prostu sposób na przetestowanie funkcji ( sin(x**2 + y**2) / (x**2 + y**2)
) w zakresie wartości dla x
i y
.
Ponieważ próbkę tę próbkowano na prostokątnej siatce, można ją teraz wizualizować jako „obraz”.
Dodatkowo wynik można teraz przekazać do funkcji oczekujących danych na siatce prostokątnej (tj. contourf
)
xx
iyy
. Tajemnicze dla mnie było to, dlaczego zwraca tę parę wyników i jak wyglądają. Odpowiedź Hai Phana jest do tego przydatna. Myślę, że robi to dla wygody, ponieważ fabuła chce dwóch takich parametrów.xx = [xvalues for y in yvalues]
yy = [[y for x in xvalues] for y in yvalues]
x
iy
wstecz? Kiedy to zrobiszxx, yy = np.meshgrid(np.arange(4), np.arange(4))
, jest to odwrotność tego, co maszx
iy
w pierwszej części odpowiedzi. Dopasowuje kolejność danych wyjściowych dlamgrid
, ale nie siatki.xx
Należy wzrasta w kierunku x, ale yours zwiększa się w kierunku y.Dzięki uprzejmości Microsoft Excel:
źródło
XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
np.vstack([XX.ravel(), YY.ravel()]).T
W rzeczywistości cel
np.meshgrid
jest już wspomniany w dokumentacji:Więc głównym celem jest utworzenie macierzy współrzędnych.
Prawdopodobnie po prostu zadałeś sobie pytanie:
Dlaczego musimy tworzyć macierze współrzędnych?
Powodem, dla którego potrzebujesz macierzy współrzędnych w Pythonie / NumPy, jest brak bezpośredniej relacji między współrzędnymi a wartościami, z wyjątkiem sytuacji, gdy współrzędne zaczynają się od zera i są czysto dodatnimi liczbami całkowitymi. Następnie możesz po prostu użyć indeksów tablicy jako indeksu. Jednak gdy tak nie jest, musisz jakoś przechowywać współrzędne obok swoich danych. Tam właśnie wchodzą siatki.
Załóżmy, że Twoje dane to:
Każda wartość reprezentuje jednak obszar o szerokości 2 kilometrów w poziomie i 3 kilometry w pionie. Załóżmy, że twoim początkiem jest lewy górny róg i potrzebujesz tablic reprezentujących odległość, którą możesz użyć:
gdzie v jest:
i H:
Więc jeśli masz dwa wskaźniki, powiedzmy
x
iy
(dlatego wartość zwracanameshgrid
jest zwyklexx
lubxs
zamiastx
w tym przypadku wybrałemh
poziomo!), Możesz uzyskać współrzędną x punktu, współrzędną y punktu i wartość w tym punkcie przy użyciu:To znacznie ułatwia śledzenie współrzędnych i (co ważniejsze) można przekazać je do funkcji, które muszą znać współrzędne.
Nieco dłuższe wyjaśnienie
Jednak
np.meshgrid
sam nie jest często używany bezpośrednio, głównie używa się jednego z podobnych obiektównp.mgrid
lubnp.ogrid
. Tutajnp.mgrid
reprezentujesparse=False
inp.ogrid
tensparse=True
przypadek (odnoszę się dosparse
argumentunp.meshgrid
). Należy pamiętać, że istnieje znaczna różnica międzynp.meshgrid
inp.ogrid
anp.mgrid
: Pierwsze dwie zwracane wartości (jeśli są dwa lub więcej) są odwrócone. Często nie ma to znaczenia, ale powinieneś podać sensowne nazwy zmiennych w zależności od kontekstu.Na przykład w przypadku siatki 2D
matplotlib.pyplot.imshow
sensowne jest nazwanie pierwszego zwróconego elementunp.meshgrid
x
i drugiego,y
gdy jest odwrotnie dlanp.mgrid
inp.ogrid
.np.ogrid
i rzadkie siatkiJak już powiedziano, wynik jest odwrócony w porównaniu do
np.meshgrid
, dlatego rozpakowałem go jakoyy, xx
zamiastxx, yy
:To już wygląda jak współrzędne, szczególnie linie xiy dla wykresów 2D.
Wizualizowane:
np.mgrid
i gęste / rozwinięte siatkiTo samo dotyczy tutaj: Wyjście jest odwrócone w porównaniu do
np.meshgrid
:W przeciwieństwie do
ogrid
tych tablic zawierają wszystkiexx
iyy
współrzędne w -5 <= xx <= 5; -5 <= yy <= 5 siatki.Funkcjonalność
Te funkcje nie ograniczają się tylko do 2D, te funkcje działają dla dowolnych wymiarów (cóż, maksymalna liczba argumentów podanych do działania w Pythonie i maksymalna liczba wymiarów dozwolona przez NumPy):
Nawet jeśli działają one również dla 1D, istnieją dwie (znacznie bardziej powszechne) funkcje tworzenia siatki 1D:
np.arange
np.linspace
Oprócz argumentu
start
istop
obsługuje równieżstep
argument (nawet złożone kroki reprezentujące liczbę kroków):Aplikacje
Pytałeś konkretnie o cel, a te siatki są niezwykle przydatne, jeśli potrzebujesz układu współrzędnych.
Na przykład, jeśli masz funkcję NumPy, która oblicza odległość w dwóch wymiarach:
I chcesz poznać odległość każdego punktu:
Wynik byłby identyczny, gdyby przejść przez gęstą siatkę zamiast otwartej siatki. Nadawanie NumPys umożliwia!
Wizualizujmy wynik:
I to również wtedy, gdy NumPys
mgrid
iogrid
stają się bardzo wygodne, ponieważ pozwala łatwo zmienić rozdzielczość twoich siatek:Ponieważ jednak
imshow
nie obsługujex
iy
danych wejściowych, należy ręcznie zmieniać tiki. Byłoby naprawdę wygodne, gdyby zaakceptował współrzędnex
iy
, prawda?NumPy ułatwia pisanie funkcji, które w naturalny sposób radzą sobie z siatkami. Ponadto istnieje kilka funkcji w NumPy, SciPy, matplotlib, które oczekują przejścia w siatce.
Lubię obrazy, więc zbadajmy
matplotlib.pyplot.contour
:Zwróć uwagę, jak współrzędne są już poprawnie ustawione! Nie byłoby tak, gdybyś właśnie zdał
density
.Albo dać inny przykład zabawy przy użyciu modeli astropy (tym razem nie obchodzi wiele o współrzędnych, po prostu wykorzystać je do stworzenia jakiegoś siatkę):
Chociaż jest to tylko „wygląd”, kilka funkcji związanych z modelami funkcjonalnymi i dopasowaniem (na przykład
scipy.interpolate.interp2d
,scipy.interpolate.griddata
nawet pokazuj przykłady użycianp.mgrid
) w Scipy itp. Wymaga siatek. Większość z nich działa z otwartymi i gęstymi siatkami, jednak niektóre działają tylko z jedną z nich.źródło
h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)
- czy nie należy pomnożyć pierwszego zakresu przez 2 km w poziomie i 3 km w pionie przez 2, a drugiego przez 3?Załóżmy, że masz funkcję:
i chcesz na przykład zobaczyć, jak to wygląda w zakresie od 0 do 2 * pi. Jak byś to zrobił? Nie
np.meshgrid
jest w:i taka fabuła wyglądałaby jak:
To
np.meshgrid
tylko wygoda. Zasadniczo to samo można zrobić poprzez:ale tam musisz być świadomy swoich wymiarów (załóżmy, że masz więcej niż dwa ...) i właściwego nadawania.
np.meshgrid
robi to wszystko dla ciebie.Ponadto meshgrid pozwala usuwać współrzędne wraz z danymi, jeśli na przykład chcesz wykonać interpolację, ale wykluczasz pewne wartości:
więc jak teraz zrobiłbyś interpolację? Możesz nadać
x
iy
do funkcji interpolacjiscipy.interpolate.interp2d
tak, abyś wiedział, które współrzędne zostały usunięte:a następnie nadal można interpolować za pomocą „właściwych” współrzędnych (wypróbuj go bez siatki, a będziesz mieć dużo dodatkowego kodu):
a oryginalna siatka pozwala ponownie uzyskać interpolację na oryginalnej siatce:
To tylko niektóre przykłady, w których użyłem,
meshgrid
może być ich znacznie więcej.źródło
xx
,yy
. Trudno było zrozumieć, czym one są i dlaczego używamy ich do obliczania funkcji. Wygląda na to, że rozumiem. Chcemy obliczyć jakąś funkcję na podstawie współrzędnych. Możemy napisać coś takiego:for x=1:10: for y=1:10: z[x,y]=sin(x)+sin(y)
Zamiast tego obliczamyz
w inny sposóbz=sin([x,x,...,x]) + sin([y,y,..y])
. Popraw mnie, jeśli się mylę!numpy
archiwizacji za pomocą : siatki lub transmisji. Jeśli nie odrzucisz punktów (patrz ostatnia część mojej odpowiedzi), oba są faktycznie funkcjonalnie równoważne. Nadawanie jest po prostu ukrytą pętlą w wymiarze, który ma być nadawany. Zauważ, że użyłem[:,None]
i[None, :]
podałem dodatkowe wymiary, aby wynik był poprawnie emitowany. Twój drugi przykład jest bardziej podobny:sin([[y],[y],..[y]])
interpolated_grid = interpolated(xx, yy)
- to mi nie działa, błąd:x and y should both be 1-D arrays
meshgrid pomaga w tworzeniu prostokątnej siatki z dwóch tablic 1-D wszystkich par punktów z dwóch tablic.
Teraz, jeśli zdefiniowałeś funkcję f (x, y) i chcesz zastosować tę funkcję do wszystkich możliwych kombinacji punktów z tablic „x” i „y”, możesz to zrobić:
Powiedzmy, że jeśli twoja funkcja tworzy iloczyn dwóch elementów, to w ten sposób można uzyskać produkt kartezjański, skutecznie dla dużych tablic.
Polecony stąd
źródło
Podstawowy pomysł
Biorąc pod uwagę możliwe wartości x
xs
, (pomyśl o nich jako znaczniki na osi x wykresu) i możliwe wartości yys
,meshgrid
generuje odpowiedni zestaw punktów siatki (x, y) --- analogicznie doset((x, y) for x in xs for y in yx)
. Na przykład, jeślixs=[1,2,3]
iys=[4,5,6]
, otrzymalibyśmy zestaw współrzędnych{(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}
.Forma wartości zwracanej
Jednak reprezentacja, która
meshgrid
zwraca, różni się od powyższego wyrażenia na dwa sposoby:Po pierwsze ,
meshgrid
określa się punkty siatki w 2d tablicy: rzędy odpowiadają różne wartości y, kolumny odpowiadają różne wartości x --- jak wlist(list((x, y) for x in xs) for y in ys)
, co daje następujący układ:Po drugie ,
meshgrid
zwraca współrzędne xiy oddzielnie (tj. W dwóch różnych tablicach numpy 2d):Uwaga,
np.meshgrid
można również generować siatki dla wyższych wymiarów. Biorąc pod uwagę xs, ys i zs, otrzymasz xcoords, ycoords, zcoords jako tablice 3d.meshgrid
obsługuje także odwrotną kolejność wymiarów, a także rzadkie odwzorowanie wyniku.Aplikacje
Dlaczego mielibyśmy chcieć tego rodzaju wyników?
Zastosuj funkcję w każdym punkcie siatki: Jedną motywacją jest to, że operatory binarne takie jak (+, -, *, /, **) są przeciążone dla tablic numpy jako operacje elementarne. Oznacza to, że jeśli mam funkcję,
def f(x, y): return (x - y) ** 2
która działa na dwóch skalarach, mogę również zastosować ją do dwóch tablic numpy, aby uzyskać tablicę wyników elementarnych: np.f(xcoords, ycoords)
Lubf(*np.meshgrid(xs, ys))
daje następujący przykład w powyższym przykładzie:Wyższa wymiarowy produkt zewnętrzna: Nie jestem pewien, jak skuteczne jest to, ale można dostać wysoki-wymiarowy produkty na zewnętrznej w ten sposób:
np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0)
.Wykresy konturowe w matplotlib: Natknąłem się
meshgrid
podczas badania rysowania wykresów konturowych za pomocą matplotlib w celu wykreślenia granic decyzji . W tym celu generujesz siatkę za pomocą, oceniaszmeshgrid
funkcję w każdym punkcie siatki (np. Jak pokazano powyżej), a następnie przekazujesz xcoords, ycoords i obliczone wartości F (tj. Zcoords) do funkcji konturu.źródło