2009-08-20 17 views
0

Guten Tag Code Ritter,Dynamische Liste Slicing

Ich habe ein kniffliges Problem, dass ich keine einfache Lösung für sehen kann. Und die Geschichte der Menschheit erklärt, dass es eine einfache Lösung für alles (ohne Geschenke kaufen)

Hier ist das Problem:

ich einen Algorithmus benötigen, die mehrdimensionale Listen und einen Filter Wörterbuch nimmt, verarbeitet sie und kehrt Listen basierend auf den Filtern.

Zum Beispiel:

Bathymetry ('x', 'y')=(182, 149) #notation for (dimensions)=(size) 
Chl ('time', 'z', 'y', 'x')=(4, 31, 149, 182) 
filters {'x':(0,20), 'y':(3), 'z':(1,2), time:()} #no filter stands for all values 

Würde zurück:

readFrom.variables['Bathymetry'][0:21, 3]  
readFrom.variables['Chl'][:, 1:3, 3, 0:21] 

Ich war für die Dimensionen über eine for-Schleife zu denken, die Filter aus der Filterliste zu lesen, aber ich kann meinen Kopf nicht um tatsächlich bekommen Übergeben der Attribute an die Schneidemaschine.

Jede Hilfe sehr geschätzt.

+3

Es tut mir leid, ich habe keine Ahnung, was Sie tun, noch was Sie tun möchten. Könntest du ein bisschen mehr erklären? – balpha

+0

In Gedanken versunken. Bearbeitet zur Vereinfachung. – Rince

+0

Ich habe geheiratet und meine Frau kauft jetzt die meisten Geschenke. –

Antwort

2

So etwas wie die folgenden funktionieren sollte:

def doit(nam, filters): 
    alldims = [] 
    for dimname in getDimNames(nam): 
     filt = filters.get(dimname,()) 
     howmany = len(filt) 
     if howmany == 0: 
     sliciflt = slice() 
     elif howmany == 1: 
     sliciflt = filt[0] 
     elif howmany in (2, 3): 
     sliciflt = slice(*filt) 
     else: 
     raise RuntimeError("%d items in slice for dim %r (%r)!" 
          % (howmany, dimname, nam)) 
     alldims.append(sliciflt) 


return readFrom.variables[nam][tuple(alldims)] 
+0

Aaah, also gibt es so etwas wie ein Scheibenobjekt. Genau was ich brauchte, vielen Dank. – Rince

3

Ich bin mir nicht sicher, ob ich Ihre Frage verstanden. Aber ich denke, das slice Objekt ist das, was Sie suchen:

Zuerst anstelle eines leeren Tupel Verwendung Keine alle Werte in der Zeit schließen

filters= {'x':(0,20), 'y':(3), 'z':(1,2), 'time':None} 

Dann ein Stück Wörterbuch wie folgt aufbauen:

d = dict(
     (k, slice(*v) if isinstance(v, tuple) else slice(v)) 
     for k, v in filters.iteritems() 
    ) 
Hier

ist die Ausgabe:

{ 
    'y': slice(None, 3, None), 
    'x': slice(0, 20, None), 
    'z': slice(1, 2, None), 
    'time': slice(None, None, None) 
} 

Dann können Sie die sli verwenden ce Objekte, um den Bereich von der Liste zu extrahieren

+1

Danke! Schade, ich kann nicht mehr akzeptieren, als ich antworte. Dein ist sehr elegant, während Martellis leichter zu verstehen ist. Als Neuling werde ich mich für den Einfacheren entscheiden. – Rince