numpy.gradient

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen

Ich möchte zu Übungszwecken eine Figur wie unter diesem Link zu sehen erstellen:
http://www.mathworks.com/access/helpdes ... dient.html

(bisschen nach unten scrollen).

Es geht mir darum, mit Python ein (vorläufig mal) zweidimensionales Skalarfeld zu berechnen (f(x,y) = x^2 * y^2).
Auf dieses Skalarfeld wende ich den Gradientoperator an (numpy.gradient). Numpy.gradient(scalarfield) gibt mir ja ein Vektorfeld mit den Gradientenvektoren zurück, die auf irgendeine Art berechnet wurden. Wenn ich den Output richtig verstehe, bekomme ich zwei Koordinaten-Sets zurück, numpy.gradient(skalarfeld)[0] alle x-Koordinaten und numpy.gradient(skalarfeld)[1] alle y-Koordinaten.
Die Richtung des Gradientenvektors an einem bestimmten Punkt gibt die Richtung des steilsten An-stiegs an und der Betrag des Vektors die Steigung.
Hier ist mein Skript, es ist mir klar, dass einiges wohl suboptimal ausgeführt wurde.
Ich mache eigentlich alles was mit Darstellung von Daten zu tun hat mit GNUPLOT. Deshalb möchte ich jetzt die Vektoren als Pfeile in Gnuplot darstellen. Wie könnte ich das am besten machen?

Code: Alles auswählen

#!/usr/bin/env python

import numpy

#Filling a list with the values of f(x) = x^2*y^2.

mult = numpy.zeros((5, 5))


data = open('mult.dat', 'w')
data.write('')
data.close()

datag = open('multgrad.dat', 'w')
datag.write('')
datag.close()


print mult


for i in range(len(mult)):
    for j in range(len(mult[i])):
        mult[i][j] += (i/10.)**2 * (j/10.)**2 





data = open('mult.dat', 'w')
datag = open('multgrad.dat', 'w')

multgrad = numpy.gradient(mult)

print mult 
print multgrad


for i in range(len(mult)):
    for j in range(len(mult[i])):
        data.write(str(i) + ' ' + str(j) + ' ' + str(mult[i][j]) + ' ' + '\n')

data.close()
datag.close()
Vielen Dank für Hinweise
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich weiß leider nicht, wie es in Gnuplot geht, aber mit NumPy und Pylab lässt sich das ganze sehr schnell nachschreiben:

Code: Alles auswählen

In [37]: x,y = mgrid[-2:2:0.2,-2:2:0.2]
In [38]: z = x * exp(-x**2 -y**2)
In [39]: px, py = gradient(z)
In [40]: contour(x,y,z)
In [41]: quiver(x,y,px,py)
Grüße
Gerrit
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Danke für die Hinweise.
Bei GNUPLOT finde ich einfach dieses 3D Zeugs so unwiderstehlich geil :)
matplotlib hat das glaub noch nicht so drauf, richtig?

Ist es eigentlich kompliziert, Pylab zu installieren? Mac OS X 10.5. Ich will mir jedenfalls auf keinen die bestehenden Pythonversionen kaputtschiessen.
[url=http://www.proandkon.com]proandkon.com[/url]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Zu OS X gibt es einen Kommentar auf der Matplotlib-Seite.

Zu 3D und Matplotlib: Es gibt ein paar Features, aber viel mehr werden es nicht werden, es sei denn jemand mit viel Zeit macht sich daran die API gründlich umzugestalten. Matplotlib ist ein 2D-Paket und wird es wohl wahrscheinlich bleiben. Zum Thema gibt es eine Übersicht auf der Scipy-Seite. Die EPD, die von Matplotlib für OS X empfohlen wird hat Mayavi2 an Bord, hinzu kommen etliche weitere Pakete. Mir gefällt der Update-Zyklus nicht so (zu langsam), aber in der Regel sind die Pakete gut aufeinander abgestimmt und man muß sich keine Sorgen machen die falsche Version X von Paket A für Version Y von Paket B zu haben.

HTH
Christian
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

ok, gut. Ich habe mir gerade die matplotlib-gallery angeschaut, es sieht ja doch so aus, als ob es möglich ist einigermassen hübsche 3d grafiken zu erstellen.
[url=http://www.proandkon.com]proandkon.com[/url]
Antworten