Seite 1 von 2

Ausfuehren eines Python Programms

Verfasst: Mittwoch 29. Juli 2009, 15:57
von Lagrange
Hallo zusammen!

Ich hoffe ihr koennt mir helfen. Ich bin ehrlich und interessiere mich nicht wirklich fuer python - bin gluecklich dass ich ein wenig c++ schreiben kann :roll:

Leider moechte ich gerne eine Funktion berechnenen. Sie sog. "Pair Correlation Function". Die Sache ist relativ kompliziert, allerdings habe ich Glueck gehabt und jemand hat so ein Programm schon einmal geschrieben. Allerdings in Python.

Ich arbeite an einem Linux PC, wenn es mit Windows einfacher geht, waere das auch kein Problem. Ich habe versucht das Programm in einer Shell mit:

python paircorrelation_01.py

zu starten. Das hat erwartungsgemaess nicht geklappt, da ich ja noch meine Parameter irgendwie einlesen muss.


Waere super, wenn mir jemand helfen koennte. Vielleicht macht mich das ganze ja doch Neugierig auf Python :)

Schon mal vielen Dank im Voraus
Lagrange


Die Parameter habe ich natuerlich alle. x,y sind Vektoren, S,rMax und dr Integer.

Der Code ist uebrigens von


http://www.shocksolution.com/microfluid ... in-python/


Code: Alles auswählen

def PairCorrelationFunction_2D(x,y,S,rMax,dr):
    """Compute the two-dimensional pair correlation function, also known 
    as the radial distribution function, for a set of circular particles 
    contained in a square region of a plane.  This simple function finds 
    reference particles such that a circle of radius rMax drawn around the 
    particle will fit entirely within the square, eliminating the need to 
    compensate for edge effects.  If no such particles exist, an error is
    returned. Try a smaller rMax...or write some code to handle edge effects! ;) 
    
    Arguments:
        x               an array of x positions of centers of particles
        y               an array of y positions of centers of particles
        S               length of each side of the square region of the plane
        rMax            outer diameter of largest annulus
        dr              increment for increasing radius of annulus

    Returns a tuple: (g, radii, interior_x, interior_y)
        g(r)            a numpy array containing the correlation function g(r)
        radii           a numpy array containing the radii of the
                        annuli used to compute g(r)
        interior_x      x coordinates of reference particles
        interior_y      y coordinates of reference particles
    """
    from numpy import zeros, sqrt, where, pi, average, arange, histogram
    # Number of particles in ring/area of ring/number of reference particles/number density
    # area of ring = pi*(r_outer**2 - r_inner**2)

    # Find particles which are close enough to the box center that a circle of radius
    # rMax will not cross any edge of the box
    bools1 = x>1.1*rMax
    bools2 = x<(S-1.1*rMax)
    bools3 = y>rMax*1.1
    bools4 = y<(S-rMax*1.1)
    interior_indices, = where(bools1*bools2*bools3*bools4)
    num_interior_particles = len(interior_indices)

    if num_interior_particles < 1:
        raise  RuntimeError ("No particles found for which a circle of radius rMax\
                will lie entirely within a square of side length S.  Decrease rMax\
                or increase the size of the square.")

    edges = arange(0., rMax+1.1*dr, dr)
    num_increments = len(edges)-1
    g = zeros([num_interior_particles, num_increments])
    radii = zeros(num_increments)
    numberDensity = len(x)/S**2

    # Compute pairwise correlation for each interior particle
    for p in range(num_interior_particles):
        index = interior_indices[p]
        d = sqrt((x[index]-x)**2 + (y[index]-y)**2)
        d[index] = 2*rMax

        (result,bins) = histogram(d, bins=edges, normed=False, new=True)
        g[p,:] = result/numberDensity
        
    # Average g(r) for all interior particles and compute radii
    g_average = zeros(num_increments)
    for i in range(num_increments):
        radii[i] = (edges[i] + edges[i+1])/2.        
        rOuter = edges[i+1]
        rInner = edges[i]
        g_average[i] = average(g[:,i])/(pi*(rOuter**2 - rInner**2))

    return (g_average, radii, x[interior_indices], y[interior_indices])
####

Verfasst: Mittwoch 29. Juli 2009, 16:21
von Leonidas
Hallo Lagrange, willkommen im Forum,

Naja, das ist nur eine Funktion. Die musst du auch irgendwann aufrufen.

Verfasst: Mittwoch 29. Juli 2009, 16:24
von Lagrange
Danke fuer die Willkommensgruesse!

Fehlermeldung war uebrigens:

pmxtf@mei pmxtf]$ python paircorrelation_01.py
sys:1: DeprecationWarning: Non-ASCII character '\xff' in file paircorrelation_01 .py on line 140, but no encoding declared; see http://www.python.org/peps/pep-02 63.html for details
File "paircorrelation_01.py", line 139
?�??�?
^
SyntaxError: invalid syntax


Ah ok, wenn ich dich richtig verstehe, muss ich da erst ein Hauptprogramm drumrumschreiben und das Ding von dort dann aufrufen. Ok, dann versuche ich mal ein Grundgeruest fuer ein Python code zu finden. So schwer kann das ja hoffentlich nicht sein.

Schade, ich dachte ich koennte das Ding einfach ausfuehren :)

Verfasst: Mittwoch 29. Juli 2009, 16:30
von Leonidas
Das Programm ist komisch. Bist du sicher dass du es in eine einfache Textdatei geschrieben hast? Die Ausgabe des Tracebacks deutet darauf hin, dass da irgendein Binärschrott in deiner Datei ist.

Verfasst: Mittwoch 29. Juli 2009, 16:38
von Lagrange
ja, ich weiss auch nicht warum - ich habe den Teil jetzt einfach mal geloescht und danach startet es mit

python filename.py

Ohne probleme. Und wenn ich in die letzte Zeile noch ein

print "Hallo"

schreibe, gibt er das auch aus. Also muss ich jetzt nur noch rausfinden, wie ich die Funktionsargumente einlese und die Ausgaben auslese

Verfasst: Mittwoch 29. Juli 2009, 16:51
von jbs
Lagrange hat geschrieben:ja, ich weiss auch nicht warum - ich habe den Teil jetzt einfach mal geloescht und danach startet es mit
was heißt denn der Teil?


[quoute]Also muss ich jetzt nur noch rausfinden, wie ich die Funktionsargumente einlese und die Ausgaben auslese[/quote]

In welchem Kontext steht denn das Programm?

Verfasst: Mittwoch 29. Juli 2009, 16:58
von Lagrange
Der letzte Teil, war der Binaere Teil. Da konnte man gar nichts lesen. Ich das waren nur komische Zeichen.

Ich habe eine Liste von Koordinaten, die die Mittelpunkte von Kreisen auf einer Flaeche Kennzeichnen. Jetzt moechte ich ausrechnen, in welchem Abstand diese Kreise zueinander stehen.
Im Internet habe ich dazu das oben angegebene Programm gefunden, das diese Aufgabe ausfuehren soll.

Jetzt ist das allerdings eine Funktion, die ich irgendwie aufrufen muss. Ich frage mich allerdings, ob ich das ueberhaupt machen muss? Wenn ich einfach die erste Zeile loesche:

Code: Alles auswählen

def PairCorrelationFunction_2D(x,y,S,rMax,dr):
Und dann in die naechste Zeile

x = [...]
y = [...]
S =
rMax =
dr =

schreibe, sollte es doch klappen - oder?

Verfasst: Mittwoch 29. Juli 2009, 17:06
von Leonidas
Und warum willst du sie nicht einfach aufrufen? Schließlich wird das return ohne die Funktionsdefinition sowieso fehlschlagen.

Verfasst: Donnerstag 30. Juli 2009, 10:02
von Lagrange
Klar wuerde ich die Funktion gerne einfach aufrufen, allerdings habe ich keine Ahnung wie ich das machen soll - und ich habe in den Tutorials die ihr im Forum angegeben habt, leider auch nichts ueber Funktionsaufrufe gefunden.

Also am liebsten wuerde ich folgendes machen:

1. Einlesen von x und y aus einem m-file oder txt-file

2. Ausfuehren der oben angegebenen Funktion

3. Ausgabe wieder in einem m-file oder txt-file


Lagrange

P.S. Eigentlich wollte ich mich ja nicht so sehr mit Python beschaeftigen, aber jetzt habe ich mich gezwungenermassen doch etwas mit beschaeftigt und es gefaellt mir eigentlich immer besser. Ist irgendwie ein Mix aus Matlab und c++.

Verfasst: Donnerstag 30. Juli 2009, 10:17
von jbs

Code: Alles auswählen

def say_hello(name):
    return 'Hello %s' %name
say_hello('Lagrange')
Funktionen gibt es in c++ doch auch, oder?

Ansonsten google doch mal nach "python funktionen"...

Verfasst: Donnerstag 30. Juli 2009, 12:09
von mkesper
Lagrange hat geschrieben:Eigentlich wollte ich mich ja nicht so sehr mit Python beschaeftigen, aber jetzt habe ich mich gezwungenermassen doch etwas mit beschaeftigt und es gefaellt mir eigentlich immer besser. Ist irgendwie ein Mix aus Matlab und c++.
Ist ja fast signature-würdig. ;)

Verfasst: Donnerstag 30. Juli 2009, 12:25
von Lagrange
@jbs
Ja, das habe ich auch gerade festgestellt - ich haette nicht gedacht dass es so einfach ist. Naja auf jeden Fall, habe ich dann einfach unten an mein Programm folgendes drangehaengt und wollte es voller vorfreude Kompilieren - war mir so sicher dass es klappt :(:

Code: Alles auswählen

S = 128
rMax = 20
dr = 2
x = [0,0,0,0,1,4,10,13,16,16,19,23,25,26,32,33,34,37,43,46,52,53,53,53,58,61,64,66,69,72,73,77,83,83,86,89,91,92,93,101,104,104,109,112,115,117]

y = [12,48,71,117,27,93,0,23,41,107,79,60,0,95,44,107,15,69,81,110,98,2,33,55,21,66,98,84,24,41,105,75,0,29,92,82,110,71,42,81,30,45,10,99,39,17]

PairCorrelationFunction_2D(x,y,S,rMax,dr)
Leider bekomme ich dann die folgende Fehlermeldung:

[pmxtf@lava Python]$ python hallo.py
Traceback (most recent call last):
File "hallo.py", line 79, in ?
PairCorrelationFunction_2D(x,y,S,rMax,dr)
File "hallo.py", line 25, in PairCorrelationFunction_2D
from numpy import zeros, sqrt, where, pi, average, arange, histogram
ImportError: No module named numpy


Daraufhin habe ich "numpy" gegoogled und festgestellt, dass das eine relative bekannte "Formelsammlung" ist, die ich auf meine altes CentOS 3 nicht installieren kann. Also bin ich zu unserem Administrator gewandert und habe ihn gefragt was ich tun kann. Er hat gesagt auf CentOS 5 ist es automatisch mit dabei. Leider bekomme ich die selbe Fehlermeldung.

Habe ich immer noch was falsch gemacht?

Lagrange

P.S. Ersteinmal vielen Dank an alle, die mir schon so viel geholfen haben, ich hoffe den letzten Schritt schaffe ich/wir jetzt auch noch :)

Verfasst: Donnerstag 30. Juli 2009, 12:39
von snafu
Lagrange hat geschrieben:Ja, das habe ich auch gerade festgestellt - ich haette nicht gedacht dass es so einfach ist.
Lol, hat dir Python jetzt einen Schrecken eingejagt, weil es so einfach ist? ;)

Verfasst: Donnerstag 30. Juli 2009, 12:48
von Leonidas
Naja, man muss es eben installieren. Das kann man entweder über das Paketmanagement machen (empfohlen) als auch "von Hand", was aber im Fall von Numpy etwas komplizierter sein könnte.

Verfasst: Donnerstag 30. Juli 2009, 12:54
von hendrikS
Lagrange hat geschrieben:...und es gefaellt mir eigentlich immer besser. Ist irgendwie ein Mix aus Matlab und c++.
Wenn Du Dir noch die matplotlib hinzunimmst wirst es Dir gleich noch besser gefallen. Die plots werden genauso gut wie bei Matlab.

Verfasst: Donnerstag 30. Juli 2009, 13:02
von Lagrange
Leonidas hat geschrieben:Naja, man muss es eben installieren. Das kann man entweder über das Paketmanagement machen (empfohlen) als auch "von Hand", was aber im Fall von Numpy etwas komplizierter sein könnte.
Ich glaube wirklich ich werde das zu Hause auf meinem Windows PC machen muessen. Ich habe hier an der Uni nur einen Shell ueber die ich Python steuern kann. Und ich schreibe meinen Code einfach in kwrite.

Verfasst: Donnerstag 30. Juli 2009, 14:50
von mkesper
Eine Shell ist wunderbar geeignet, um GNU/Linux-Systeme zu verwalten. Mit root-Rechten sollte ein

Code: Alles auswählen

yum install python-numpy
ausreichen. Aber das ist ziemlich off-topic für dieses Forum, frag im Zweifelsfall nochmal deinen Admin.

Verfasst: Freitag 31. Juli 2009, 14:46
von Lagrange
Ok - Ich bin wieder ein Schritt weiter. numpy laeuft jetzt :). Und es sieht auch so aus, als wueder das Programm starten, leider bricht es mit einer Fehlermeldung ab, mit der ich beim besten Willen nix anfangen kann :(:

Traceback (most recent call last):
File "hello.py", line 79, in ?
PairCorrelationFunction_2D(x,y,S,rMax,dr)
File "hello.py", line 35, in PairCorrelationFunction_2D
interior_indices, = where(bools1*bools2*bools3*bools4)
ValueError: need more than 0 values to unpack


Jetzt habe ich versucht ueber "help(numpy.where)" mir mal anzuschauen, was diese Funktion ueberhaupt macht. Leider werde ich da nicht schlau draus. Auch das Komma nach dem "interior_indices" sieht irgendwie komisch aus.


EDIT:
So ich habe jetzt das Komma einfach mal weggemacht und dann kommt er auf jeden Fall schon mal weiter. Allerdings nicht viel. Ich glaube ich habe auch den Fehler schon gefunden:

Code: Alles auswählen

    bools1 = x>1.1*rMax
    bools2 = x<(S-1.1*rMax)
    bools3 = y>rMax*1.1
    bools4 = y<(S-rMax*1.1)
    
   
    interior_indices = where(bools1*bools2*bools3*bools4)

x und y sind Vektoren und wenn ich das hier richtig verstanden habe, sollen die Eintraege verglichen werden. Und dann jeweils ein "True" oder ein "False" zurueckgegeben werden. Leider macht Python das nur fuer den ersten Eintrag von x bzw y, d.h. bools1 bis bools4 sind keine arrays, obwohl sie das sollten

Verfasst: Freitag 31. Juli 2009, 15:06
von EyDu
Die Fehlermeldung sagt, dass "where" ein leeres Tupel zurück liefert. Das Komma macht übrigens Sinn:

Code: Alles auswählen

test = tuple([42])
print test

test, = tuple([42])
print test
Code zu den Fehlermeldungen ist übrigens sehr sinnvoll.

Verfasst: Freitag 31. Juli 2009, 15:14
von Lagrange
ah ok, danke!

dann liegt der Fehler wohl bei

Code: Alles auswählen

    bools1 = x>1.1*rMax
    bools2 = x<(S-1.1*rMax)
    bools3 = y>rMax*1.1
    bools4 = y<(S-rMax*1.1)
weil da nicht jeder Eintrag von x bzw y einzeln betrachtet wird. Also bools1 bis bools4 selbst keine Vektoren sind