2016-07-21 6 views
0

Konzeptionell ist das eine Art von was ich tun wollte. Ich wollte zufällige Punkte in einer 2D-Ebene auswählen und dann ein Oberflächen-Diagramm zeichnen, wie das aussehen würde. Ähnlich könnte eine Alternative (suboptimale Idee) darin bestehen, ein Meshgrid zu klassifizieren und N zufällige Punkte und ihre entsprechenden Höhen auszuwählen und sie dann in einem Oberflächendiagramm zu plotten.Wie verwendet man die Meshgrid-Funktion von numpy mit einem zufälligen Intervall statt einem gleichmäßigen?

Derzeit ist die einzige erfolgreiche Art und Weise, die ich habe in der Lage, um die Oberflächen Plots zu machen ist mit ebenso intervaled Punkten mit den folgenden:

start_val, end_val = -1,1 
N = 100 
x_range = np.linspace(start_val, end_val, N) 
y_range = np.linspace(start_val, end_val, N) 
(X,Y) = np.meshgrid(x_range, y_range) 
Z = np.sin(2*np.pi*X) + 4*np.power(Y - 0.5, 2) #function height for the sake of an example 

und dann zeichnen Sie die Sache mit dem Standard:

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm) 
plt.title('Original function') 

plt.show() 

Dies führt zu einem schönen Diagramm der Funktion, wie ich es erwartet hatte.

Allerdings möchte ich zufällige Punkte in einem bekannten Intervall auswählen. Dafür habe ich versucht, die Alternative:

start_val, end_val = -1,1 
N = 100 
x_range = np.random.uniform(low=start_val, high=end_val, size=N) 
y_range = np.random.uniform(low=start_val, high=end_val, size=N) 
(X,Y) = np.meshgrid(x_range, y_range) 
Z = np.sin(2*np.pi*X) + 4*np.power(Y - 0.5, 2) #function height for the sake of an example 

Leider, dass die Ergebnisse in nicht-Sinn:

enter image description here

statt etwas schöner als das Original mit den gleichmäßig verteilten Punkten:

enter image description here

jemand weiß, wie man die Aufgabe (oder eine ähnliche Aufgabe) Ich versuche zu tun, aber in der Lage zu plotten lief dom points oder ein wenig Zufälligkeit sinnvoll einbeziehen?

+0

Dies klingt interessant, aber ich verstehe Ihr Hauptziel nicht: 'Ich wollte zufällige Punkte in einer 2D-Ebene auswählen und dann eine Oberflächenzeichnung zeichnen, wie das aussehen würde. Wie würden Sie die Höheninformationen für die Oberfläche aus zufälligen Punkten in 2D erhalten? Zum Beispiel, wenn Sie zufällig (4,4) in 2D wählen, wie erhalten Sie den dritten Wert in 3D (4,4 ,?) – mitoRibo

+0

Ich empfehle, x_range und y_range zu sortieren, bevor Sie sie in Meshgrid verwenden. –

+0

@rbierman Wenn Sie zwei Matrizen ihrer X- und Y-Koordinaten haben, können Sie einfach berechnen, was die Funktion ist. In Ihrem Beispiel tun Sie 'np.sin (2 * np.pi * X) + 4 * np.macht (Y - 0.5, 2)' mit X = 4 und Y = 4.Solange Sie die Koordinaten so organisiert haben, dass i mit X ith Y entspricht, berechnen Sie einfach Z mit f (X [i], Y [i]). – Pinocchio

Antwort

2

Die für Meshgrid verwendeten x- und y-Bereiche sollten nicht in zufälliger Reihenfolge sein. Dies liegt daran, dass es zum Zeichnen einer Fläche nicht ausreicht, nur einen Haufen Punkte im XYZ-Raum zu haben: wir müssen auch wissen, mit welchen Verbindungen wir verbunden sind. Dies wird aus der Adjazenz von Werten in den Arrays bestimmt.

Beispiel: Wenn x_range [1, 2, 3] und y_range [5, 9] ist, dann wissen wir, dass die Punkte (1,5), (2,5), (1,9) und (2,9) bilden die Eckpunkte eines Rechtecks, das in der Fläche enthalten sein soll (natürlich mit den entsprechenden Z-Werten). Wenn der x_range stattdessen [1, 3, 2] wäre, hätten wir stattdessen ein Rechteck basierend auf (1,5), (3,5), (1,9) und (3,9).

Um einen Graphen von z = f (x, y) zu haben, müssen wir sortierten x und y-Arrays, so dass Rechtecke wir so aussehen erhalten:

plot

(Für Parameterdarstellungen, mit x, y, z sind Funktionen der Parameter u, v, wir haben nicht notwendigerweise sortierte x- und y-Werte, aber u und v werden wahrscheinlich sein, und ihre Reihenfolge wird die Reihenfolge von x, y bestimmen.)

+0

Entschuldigung für das Follow-up, aber ich vermute, dass Sortierung nur funktioniert, weil ich die 2D-Ebene einheitlich und völlig zufällig (dh x und y-Koordinaten sind unabhängig voneinander, also p (x, y) = p (x) p (y)) . In diesem Fall hat die Sortierung keine Auswirkung. Aber wenn die x, y Ebene Probe mit einer Verteilung war, die speziell war und sich um die gemeinsamen Werte von x, y kümmerte, würde das Sortieren einfach funktionieren? Meine Intuition sagt mir, dass wir vielleicht noch sortieren müssen (damit die Plotfunktionen angezeigt werden) richtig) aber in einer Weise, die entsprechenden x, y Paare zu behalten? Oder liege ich falsch? Sonst könnten wir die falsche (rand) -Funktion anzeigen. – Pinocchio

+0

Wenn Sie beispielsweise eine normale Verteilung abtasten würden, würde meshgrid (x, y) für Sie nicht funktionieren: Es werden für jeden Wert im x-Array gleich viele Punkte erstellt. Die Unabhängigkeit, p (x) p (y), ist in das eingebaut, was sie tut. Um eine Verteilung mit xy-Abhängigkeit zu modellieren, benötigen Sie eine Änderung der Koordinaten x = f (u, v), y = g (u, v), wobei f, g die Gleichverteilung von u, v in die gewünschte Verteilung von x, y. Dann würden Sie (U, V) = np.meshgrid (u, v) und X = f (U, V), Y = f (U, V) verwenden. Die sortierten Dinge hier wären die Parameter u und v. Darauf habe ich am Ende der Antwort hingewiesen. –

+0

das, was ich sehr kontraintuitiv finde, ist warum, wenn ich nur Punkte von oben auf einem 2D-Gitter mit einer gewissen Verteilung auswähle (was ich will). Warum kann Meshgitter nicht einfach so etwas wie die nächsten Nachbarn verwenden und die Oberfläche nach Nachbarn verbinden? Sortieren scheint nur wie ein Hack statt eine Lösung für das eigentliche Problem (ich vermied es, Referenz auf Ihre parametrische u, v Vorschlag, weil ich es nicht verstehe, meine Entschuldigung, ich wünschte, ich hätte es verstanden). – Pinocchio

Verwandte Themen