2016-09-27 3 views
3

Ich möchte fragen, wie Sie entsprechende Werte aus einem Meshgrid generieren. Ich habe eine Funktion "foo", die ein 1D-Array mit der Länge 2 nimmt und eine reelle Zahl zurückgibt.Generieren von Daten aus Meshgrid-Daten (Numpy)

import numpy as np 

def foo(X): 
    #this function takes a vector, e.g., np.array([2,3]), and returns a real number. 
    return sum(X)**np.sin(sum(X)); 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 

Ich erzeuge X-und Y-Grids mit Meshgrid.

Dann, wie kann ich entsprechende Z-Werte mit "foo" -Funktion erzeugen, um sie in 3D zu plotten, z. B. Plotten mit Plot_Surface-Funktion mit X, Y, Z-Werten?

Hier ist die Frage, wie Z-Werte, die die gleiche Form zu X und Y hat, mit "Foo" -Funktion zu generieren. Da meine "foo" -Funktion nur ein 1D-Array benötigt, weiß ich nicht, wie ich diese Funktion mit X und Y verwenden kann, um entsprechende Z-Werte zu erzeugen.

+0

Möchten Sie 'z = foo ([x, y])' für jeden Punkt '(x, y)' im Meshgrid? – Praveen

Antwort

2

Stapeln Sie Ihre zwei numply Arrays in "Tiefe" mit np.dstack, und ändern Sie dann Ihre foo Funktion, so dass es nur auf der letzten Achse des gestapelten Arrays arbeitet. Dies ist leicht mit np.sum mit dem Parameter erfolgt axis=-1, anstatt die builtin sum mit:

import numpy as np 

def foo(xy): 
    return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1)) 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 
XY = np.dstack((X, Y)) 

Und jetzt, sollten Sie:

>>> XY.shape 
(5, 3, 2) 
>>> foo(XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 

Wenn Sie den gleichen Effekt erzielen möchten, aber ohne modifizieren foo, dann können Sie np.apply_along_axis verwenden, die genau das tun sollten, was Sie brauchen:

>>> np.apply_along_axis(foo, -1, XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 
+0

Danke für die wunderbare Lösung. Genau das wollte ich tun. Ich habe jedoch einige Probleme, diesen Ansatz auf meinen Code Bock anzuwenden. Ich habe tatsächlich eine andere Frage zu diesem Thema gestellt [link] (http://stackoverflow.com/questions/39715227/making-a-function-that-can-take-arguments-in-various-shapes). Meine eigentliche foo-Funktion ist eigentlich etwas wie 'return X [0] + X [1];', also kann sie keine iterative Operation für ein verschachteltes Array durchführen und kann nur die Form von (2,) annehmen. Wenn ich also XY in meine eigentliche foo-Funktion einfüge, spuckt es unseren Fehler aus. Wie kann man in diesem Fall Z erzeugen wie du? –

+0

Hoppla, tut mir leid, ich habe es vergessen! –

+0

Übrigens, kannst du mir bitte mitteilen, wie ich deine Ode ändern soll, wenn ich nur meine aktuelle Foo-Funktion benutzen möchte, die nur (2,) Form annehmen kann? –

Verwandte Themen