2017-04-24 2 views
1

Ich bin ziemlich neu zu Python, also ertragen Sie mit mir. Ich schreibe ein Programm, um eine physikalische Größe zu berechnen, nennen wir es A. A ist eine Funktion von mehreren Variablen, nennen wir sie x, y, z. So habe ich drei verschachtelte Schleifen A für die Werte von x zu berechnen, y, z, die ich interessiert bin.Erstellen einer mehrdimensionalen Liste von Vektoren

for x in xs: 
for y in ys: 
    for z in zs: 
    A[x, y, z] = function_calculating_value(x,y,z) 

Nun das Problem ist, dass A [x, y, z] ist zweidimensionale Anordnung enthält sowohl den Mittelwert als auch die Varianz, so dass A [x, y, z] = [Mittelwert, Varianz]. Aus anderen Sprachen bin ich es gewohnt, A mit einer Funktion ähnlich wie np.zeros() zu initialisieren. Wie mache ich das hier? Was ist der einfachste Weg, um das zu erreichen, was ich will, und wie greife ich für einen gegebenen (x, y, z) leicht auf den Mittelwert und die Varianz zu?

(das Endziel ist es, den Mittelwert der Varianz als Fehlerbalken zu zeichnen, so, wenn es dies zu tun, ein noch elegantere Weg ist, schätze ich, dass auch)

Dank im Voraus!

+0

Mit was genau arbeiten Sie? Python hat keinen eingebauten Typ namens "Vektor"? meinst du eine 'liste'? Oder du hast "numpy" erwähnt, meinst du eine "numpige" Datenstruktur? 'A [x, y, z]' impliziert ein * dreidimensionales * Array. –

Antwort

1

Sie können Ihre mehrdimensionales Array mit numpy

# Generate a random 4d array that has nx = 3, ny = 3, and nz = 3, with each 3D point having 2 values 
mdarray = np.random.random(size = (3,3,3,2)) 

# The overall shape of the 4d array 
mdarray 
Out[66]: 
array([[[[ 0.80091246, 0.28476668], 
     [ 0.94264747, 0.27247111], 
     [ 0.64503087, 0.13722768]], 

     [[ 0.21371798, 0.41006764], 
     [ 0.79783723, 0.02537987], 
     [ 0.80658387, 0.43464532]], 

     [[ 0.04566927, 0.74836831], 
     [ 0.8280196 , 0.90288647], 
     [ 0.59271082, 0.65910184]]], 


     [[[ 0.82533798, 0.29075978], 
     [ 0.76496127, 0.1308289 ], 
     [ 0.22767752, 0.01865939]], 

     [[ 0.76849458, 0.7934015 ], 
     [ 0.93313128, 0.88436557], 
     [ 0.06897508, 0.00307739]], 

     [[ 0.15975812, 0.00792386], 
     [ 0.40292818, 0.21209199], 
     [ 0.48805502, 0.71974702]]], 


     [[[ 0.66522525, 0.49797465], 
     [ 0.29369336, 0.68743839], 
     [ 0.46411967, 0.69547356]], 

     [[ 0.50339875, 0.66423777], 
     [ 0.80520751, 0.88115054], 
     [ 0.08296022, 0.69467829]], 

     [[ 0.76572574, 0.45332754], 
     [ 0.87982243, 0.15773385], 
     [ 0.5762041 , 0.91268172]]]]) 

# Both values for this specific sample at x = 0, y = 1 and z = 2 
mdarray[0,1,2] 
Out[67]: array([ 0.80658387, 0.43464532]) 

mdarray[0,1,2,0] # mean only at the same point 
Out[68]: 0.8065838666297338 

mdarray[0,1,2,1] # variance only at the same point 
Out[69]: 0.43464532443865489 

Sie können auch nur die Mittel oder die Varianzwerte getrennt durch Schneiden des Arrays erhalten erstellen und bearbeiten:

mean  = mdarray[:,:,:,0] 
variance = mdarray[:,:,:,1] 

mean 
Out[74]: 
array([[[ 0.80091246, 0.94264747, 0.64503087], 
     [ 0.21371798, 0.79783723, 0.80658387], 
     [ 0.04566927, 0.8280196 , 0.59271082]], 

     [[ 0.82533798, 0.76496127, 0.22767752], 
     [ 0.76849458, 0.93313128, 0.06897508], 
     [ 0.15975812, 0.40292818, 0.48805502]], 

     [[ 0.66522525, 0.29369336, 0.46411967], 
     [ 0.50339875, 0.80520751, 0.08296022], 
     [ 0.76572574, 0.87982243, 0.5762041 ]]]) 

Ich bin Ich bin mir immer noch nicht sicher, wie ich diese Daten lieber geplottet hätte, werde darüber nachdenken und diese Antwort aktualisieren.

Verwandte Themen