Netzgitterfunktionen in Python (meshgrid mgrid ogrid ndgrid)

Antworten:

80

numpy.meshgridist nach Matlabs meshgridBefehl modelliert . Es wird verwendet, um Funktionen von zwei Variablen zu vektorisieren, so dass Sie schreiben können

x = numpy.array([1, 2, 3])
y = numpy.array([10, 20, 30]) 
XX, YY = numpy.meshgrid(x, y)
ZZ = XX + YY

ZZ => array([[11, 12, 13],
             [21, 22, 23],
             [31, 32, 33]])

So ZZenthält alle Kombinationen von xund yin die Funktion setzen. Wenn Sie darüber nachdenken, meshgridist es für numpy Arrays, wie sie senden, etwas überflüssig. Das heißt, Sie können tun

XX, YY = numpy.atleast_2d(x, y)
YY = YY.T # transpose to allow broadcasting
ZZ = XX + YY

und erhalten das gleiche Ergebnis.

mgridund ogridsind Hilfsklassen, die die Indexnotation verwenden, damit Sie XXund YYin den vorherigen Beispielen direkt erstellen können , ohne etwas wie verwenden zu müssen linspace. Die Reihenfolge, in der die Ausgabe generiert wird, ist umgekehrt.

YY, XX = numpy.mgrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the output of meshgrid

YY, XX = numpy.ogrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the atleast_2d example

Ich bin nicht mit den Scitools vertraut, aber es ndgridscheint gleichwertig zu sein meshgrid, während BoxGrides tatsächlich eine ganze Klasse ist, um bei dieser Art von Generation zu helfen.

chthonicdaemon
quelle
Danke für deine Antwort. Aber ich verstehe nicht, was ich verwenden soll, wenn ich 3 Parameter (oder mehr) habe. Nennen wir sie x1, x2, x3!
scls
2
Meshgrid ist explizit 2D. Die anderen unterstützen alle mehr Dimensionen. Das würde tatsächlich die Existenz von ndgrid erklären.
Chthonicdaemon
3
Die Ergebnisse von Meshgrid und Mgrid sind unterschiedlich. Versuchen Sie einfach Mgrid [1: 4, 1: 4] und Meshgrid ([1,2,3], [1,2,3]).
FJDU
1
Im zweiten Abschnitt, wo Sie es tun XX = XX.T, sollte es wirklich sein YY = YY.T. Dies wird deutlich, wenn x und y unterschiedlich sind.
MountainX
Warum möchten Sie die Verwendung von Linspace vermeiden?
Manuel Pena
7

np.mgridund np.meshgrid()machen Sie dasselbe, aber die erste und die zweite Achse werden vertauscht:

# 3D
d1, d2, d3 = np.mgrid[0:10, 0:10, 0:10]
d11, d22, d33 = np.meshgrid(np.arange(10),np.arange(10),np.arange(10))
np.array_equal(d1,d11)

ergibt False. Tauschen Sie einfach die ersten beiden Dimensionen aus:

d11 = np.transpose(d11,[1,0,2])
np.array_equal(d1,d11)

ergibt True.

dopexxx
quelle