2017-03-15 6 views
0

Also habe ich diesen Code in Python geschrieben. Ich werde es nicht erklären, da es sich um eine einfache Syntaxkorrektur handelt, die ich nicht zu sehen bekomme. Es ist daher sinnlos zu erklären, wofür es ist.Wissenschaftliche Python-Array-Syntax

Das Problem, das ich habe, ist, dass für einen gegebenen d, zum Beispiel 15 ich den Wert von "cuentas" richtig und "e" richtig bekomme.

Was ich tun möchte, ist eine Reihe von d's durchlaufen und den Wert von jedem cuentas und jedem e zu erhalten, um d vs e zu plotten.

Mein Problem ist, dass ich nicht scheinen, wie man eine Matrix in Python erstellen.

in Matlab verwendet i zwei verschiedene Schleifen wie theese zu schreiben:

for i=1:1:N 
    for j=1:9 

     a[i,j]= and so on 

a [i, j] würde eine Matrix mit N Reihen und 9 Spalten, die i zugreifen konnten und manipulieren.

In meinem Code unten i intentionaly Kommentare # gesetzt wird, wo ich

import numpy as np 
import matplotlib.pyplot as plt 
N=100000 
cos=np.zeros(N) 
phi=np.zeros(N) 
teta=np.zeros(N) 
a=np.zeros(N) 


xrn=np.zeros(N) 
yrn=np.zeros(N) 
zrn=np.zeros(N) 

x=np.zeros(N) 
y=np.zeros(N) 
z=np.zeros(N) 

lim1=14.7 
lim2=3.35 
lim3=-lim1 
lim4=-lim2 

#d=np.array([15,20,25,30,35,40,45,50,55]) 
d=15 

    #for j in range(9): 
for i in range(N): 
    cos[i]=np.random.uniform(-1,1) 
    teta[i]=np.random.uniform(-np.pi,np.pi) 
    phi[i]=np.random.uniform(0,2*np.pi) 

# a[i]=d[j]/cos[i]*np.cos(phi[i]) 
a[i]=d/cos[i]*np.cos(phi[i]) 


xrn[i]=np.random.uniform(-1,1)*lim1 
yrn[i]=np.random.uniform(-1,1)*lim2 

x[i]=a[i]*np.sin(teta[i])*np.cos(phi[i])+xrn[i] 
y[i]=a[i]*np.sin(teta[i])*np.sin(phi[i])+yrn[i] 

#cuentas[j]=0 
cuentas=0 

#for j in range(9): 
for i in range(N): 
    if a[i]>0 and x[i] < lim1 and x[i]>lim3 and y[i] < lim2 and y[i]>lim4: 
     cuentas=cuentas+1 
#e[j]=cuenta[j]/N 
e=cuentas/N 
durch die Entfernungen iterieren wollen Lesen

Vielen Dank an diejenigen, auch !!

+1

Können Sie _exactly_ klarstellen, welche Ausgabe von Ihrem Skript erwartet wird? Es scheint keine offensichtlichen Fehler zu geben – tel

Antwort

1

Kurzversion:

Dies ist das genaue Äquivalent von MATLAB-Code in Python

a = np.zeros([N, 9]) 
for i in range(N): 
    for j in range(9): 
     a[i,j]= and so on 

Der einzige große Unterschied besteht darin, dass Sie das Array vorher definieren müssen, was Sie wirklich auch in MATLAB tun sollten, wenn Ihr Code eine angemessene Leistung haben soll.

Wenn Sie jedoch die Größe nicht kennen, können Sie Listen in Python verwenden und am Ende in ein numpliges Array konvertieren. Dies ist viel, viel schneller als Ihr MATLAB Beispiel für große Arrays wegen der Einbauten, wie Listen und Matrizen/Arrays verteilt werden:

a = [] 
for i in range(N): 
    a.append([]) 
    for j in range(9): 
     a[-1].append(and so on 
a = np.array(a) 

Die [-1] Mittel (das „letzte Element a“ und die append setzt, was in den Klammern am Ende der Liste ist So. a[-1].append(foo) „inside foo setzen bedeutet, was in dem letzten Elemente a ist

Lange Version:..

Ihr MATLAB-Code in Python r arbeiten genau so, aber es gibt ein paar bemerkenswerte Unterschiede, die Sie berücksichtigen müssen.

Erstens funktioniert die Zuweisung zu einem Index, der größer als ein vorhandenes Array/Matrix ist, in MATLAB, aber nicht in numpy. Also, wenn Sie eine Größe [5, 5] Array/Matrix haben, können Sie in MATLAB Element [5, 6] zuweisen, aber Sie können nicht in numpy. Dies bedeutet, dass Sie in MATLAB mit einem leeren Array beginnen können, während Sie die Array-Größe vorher festlegen müssen.Beachten Sie, dass MATLAB-Matrizen nicht tatsächlich skaliert werden können. Sie erstellen tatsächlich jedes Mal eine neue Matrix durch die Schleife und kopieren alle Daten dorthin. Das ist sehr langsam, weshalb MATLAB Sie warnt, das Array vorher zuzuweisen. Numpy tut nicht so, als ob man in der Lage wäre, die Größe von Arrays zu ändern. Sie müssen also expliziter vorgehen, wenn Sie eine Liste kopieren, vorbelegen oder eine Liste verwenden (die in der Größe veränderbar ist).

Zweitens, MATLAB erfordert nicht, dass Sie die Matrix definieren, bevor Sie sie verwenden, während numpy tut. Der Grund dafür ist, dass MATLAB traditionell drei Datenstrukturen (Matrizen, Zellenarrays und Strukturen) mit jeweils eigenem Indizierungsstil hat. So kann MATLAB herausfinden, welche Art von Datenstruktur Sie erstellen möchten, indem Sie sie indexieren. Python verfügt nur über einen Indizierungsstil, so dass diese Art von Vermutung nicht möglich ist.

Drittens erzeugt die Verwendung einer einzigen Array-Größe in MATLAB mit einigen (aber nicht allen) Funktionen eine 2D-Quadratmatrix mit jeder Dimension dieser Größe, während in Numpy ein 1D-Array erstellt wird. Ich bin mir nicht sicher, ob Sie das erwarten oder nicht. Ehrlich gesagt habe ich keine Ahnung, warum MATLAB so funktioniert.

Viertens können numpy Arrays eine beliebige Anzahl von Dimensionen haben, 0 (Skalare), 1 (Vektoren), 2, 3, 4, usw. MATLAB-Matrizen müssen andererseits mindestens zwei Dimensionen haben. Dies kann zu einigen unerwarteten Unterschieden führen, z. B. beim Transponieren von nichts für numpige Vektoren.

Wie für Ihren Python-Code, ohne dass Sie sagen, was schief läuft, kann ich Ihnen nicht sagen, wie Sie es beheben können. Aber hoffentlich habe ich dir genug Informationen gegeben, um es selbst zu machen.

1

Sie können Matrix in Python erstellen in der folgenden Art und Weise unter Verwendung von numpy:

n=5 
k=4 
a=np.zeros([n,k]) 
for i in range(n): 
    for j in range(k): 
     a[i,j]=i+j 
print(a) 

Das Ergebnis ist

[[ 0. 1. 2. 3.] 
[ 1. 2. 3. 4.] 
[ 2. 3. 4. 5.] 
[ 3. 4. 5. 6.] 
[ 4. 5. 6. 7.]] 
0

Also ich habe Ihre Antworten angenommen und es hat funktioniert!

Wenn sich jemand wundert, ist es eine Monte-Carlo-Simulation, wie viele Teilchen durch beide raktangularen Detektoren passieren würden. Wie ich die Partikel aus dem Detektor 1 werfen es trivial ist, dass sie durch sie gehen, und i die Anzahl zählen, die Detektor 2.

Der korrigierte Code übergeben ist

N=100000 
"La dirección viene dada por v=[rsin(teta)*cos(phi),rsin(teta)sin(phi),rcos(teta)]" 
"Los vectores que vamos a usar debemos inicializarlos como un vector de ceros" 
cos=np.zeros([10,N]) 
phi=np.zeros([10,N]) 
teta=np.zeros([10,N]) 
a=np.zeros([10,N]) 

xrn=np.zeros(N) 
yrn=np.zeros(N) 
zrn=np.zeros(N) 

x=np.zeros([10,N]) 
y=np.zeros([10,N]) 
z=np.zeros([10,N]) 

lim1=14.7 
lim2=3.35 
lim3=-lim1 
lim4=-lim2 
"d son las disversas distancias a las que colocamos la fuente con respecto al detector" 

d=np.array([0.00001,15,20,25,30,35,40,45,50,55]) 

"e es la eficiencia geométrica simulada" 
e=np.zeros(10) 

"Debemos definir el coseno como números aleatorios en vez de el ángulo teta, debido a que queremos" 
"que se distribuyan uniformemente por toda la esfera" 
for j in range(10): 
    for i in range(N): 
     cos[j,i]=np.random.uniform(0,1) 

     phi[j,i]=np.random.uniform(0,2*np.pi) 

     a[j,i]=d[j]/cos[j,i] 

     xrn[i]=np.random.uniform(-1,1)*lim1 
     yrn[i]=np.random.uniform(-1,1)*lim2 

     x[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.cos(phi[j,i])+xrn[i] 
     y[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.sin(phi[j,i])+yrn[i] 


cuentas=np.zeros(10) 
for j in range(10): 
    for i in range(N): 
     if a[j,i]>0 and x[j,i] < lim1 and x[j,i]>lim3 and y[j,i] < lim2 and y[j,i]>lim4: 
      cuentas[j]=cuentas[j]+1 

    e[j]=cuentas[j]/N 

Dank an alle!

Verwandte Themen