2 Stimmen

scipy - Konstruktion eines Gitters, das Moleküle in 2d Dimensionen einfängt

Dies ist eine Fortsetzung einer früheren Stackoverflow-Frage aquí

Ich möchte es in 2 Dimensionen machen. Ich habe das Folgende versucht:

for i in range(pos):
    steps=0   #the steps that the particle does until it falls in  a trap
    in_pos = sc.random.randint(0, len(grid), 2)
    initial_trap=False
    while initial_trap==False:
        #the step of the particle can be one of this
        step=sc.array(random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]]))          
        # Check position for edges and fix if required

        if in_pos + step > sc.size(grid) - 1:
            in_pos = 0
        elif in_pos + step < 0:
            in_pos = sc.size(grid) - 1
        else:
            in_pos += step

        # Check if it's a trap in order to stop the loop

        if grid[in_pos] == 0:
            initial_trap = True

        # If it isn't a trap, continue
        steps+=1
    steps_count.append(steps)
return steps_count

Ich habe es auch versucht:

in_pos_x =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in x axis
in_pos_y =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in y axis

if  in_pos_x + step > len(grid)- 1 and in_pos_y + step > len(grid)-1:
    in_pos_x = 0
    in_pos_y = 0
elif in_pos_x + step < 0 and in_pos_y + step < 0:
    in_pos_x = len(grid)- 1
    in_pos_y = len(grid)- 1
else:    in_pos_x += step
    in_pos_y += step

if grid[in_pos_x][in_pos_y] == 0:
    initial_trap = True

Und zuletzt habe ich versucht, mit Listen zu arbeiten, nicht mit Arrays.

in_pos = (scipy.random.randint(0,len(grid),2)).tolist()
step=random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]])

aber auch hier ohne Erfolg. Ich bin hier verloren!

---------------Error messages-----------------------------

Wenn ich das Programm ausführe, erhalte ich:

Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig. Verwenden Sie a.any() oder a.all()' in der Zeile "if (in_pos + step) > sc.size(grid) - 1:".

Wenn ich die if sc.any(in_pos + step) > sc.size(grid) - 1: o if sc.any(grid[in_pos]) == 0: es läuft, aber ich habe ein print(grid[in_pos]) und ich habe festgestellt, dass sich die Werte überhaupt nicht ändern! Sie erhält nicht den Wert "0", so dass die Schleife nie endet.

3voto

Avaris Punkte 34633

Nach den Kommentaren denke ich, dass ich verstehe, worauf Sie hinauswollen.

Ich vermute, dass Sie periodische Grenzen verwenden, aber die Prüfung, die Sie wie unten beschrieben durchführen, ist falsch:

# Check position for edges and fix if requireD

if in_pos + step > sc.size(grid) - 1:
    in_pos = 0
elif in_pos + step < 0:
    in_pos = sc.size(grid) - 1
else:
    in_pos += step

size gibt die Gesamtzahl der Elemente in einem Array zurück. Sie müssen die einzelnen Längen (in x y y Richtungen) des Arrays. Hier, shape ist Ihr Freund. Und Sie müssen den Index korrigieren, der über die Grenzen hinausgeht, nicht alle von ihnen. mod Betreiber % von Nutzen sein kann. Der obige Code kann also einfach umgeschrieben werden als:

# Move by step
in_pos += step
# Correct according to periodic boundaries
in_pos = in_pos % grid.shape    # or simply in_pos %= grid.shape

Das zweite Problem ist die Indizierung von grid . Es genügt zu sagen, dass das, was Sie tun, nicht das ist, was Sie wollen ( Details finden Sie in den Dokumenten ). Für Ihren einfachen Fall kann es umgeschrieben werden als:

if grid[in_pos[0], in_pos[1]] == 0:
    initial_trap = True

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X