2017-12-31 128 views
1

Ich habe ein Schwarz-Weiß-Bild als numpy Array geladen. Die Array-Form ist gleich den Pixeln im Bild. Ich möchte bestimmte Bereiche von Pixelwerten extrahieren, zum Beispiel,Slice-Liste, wo Indexwerte Strings sind?

numpy_array_to_slice[160:300,28:43] 

etc etc, aber ich will nicht die Indexnummern codieren. Stattdessen möchte ich die Indexwerte aus einer Liste von Werten laden. Zum Beispiel habe ich eine Liste von Indexwerten wie:

listofindexvalues = [['160:300,28:43'],['160:300,40:55'],['160:300,28:43']] 

So effektiv möchte ich so etwas wie:

numpy_array_to_slice[listofindexvalues[0]] 

die an die Stelle nehmen würde:

numpy_array_to_slice['160:300,28:43'] 

Ich habe versuchte eine Vielzahl von Dingen, die nicht funktioniert haben wie:

first,second = str(index_list[19]).replace('[','').replace(']','').replace('\'','').split(':') ##for just one side of an index value, such as 28:59 

und versucht, das passieren, wie so:

numpy_array_to_slice[int(first)+':'+int(second] 

aber das funktioniert nicht, weil ich diese Werte nicht verketten kann. Gibt es einen Weg, dies zu erreichen?

Antwort

5

Schneiden ist Syntax, keine Zeichenfolge. Siehe Slicings expressions reference documentation:

Die Semantik für ein Slicing sind wie folgt. Die Primärdatenbank wird indiziert (unter Verwendung der gleichen __getitem__()-Methode als normale Subskription) mit einem Schlüssel, der wie folgt aus der Slice-Liste erstellt wird. Wenn die Slice-Liste mindestens ein Komma enthält, ist der Schlüssel ein Tupel, das die Konvertierung der Slice-Elemente enthält; Andernfalls ist die Umwandlung des einzelnen Slice-Elements der Schlüssel. Die Umwandlung eines Segmentelements, das ein Ausdruck ist, ist dieser Ausdruck. Die Umwandlung eines richtigen Slice ist ein slice Objekt (siehe Abschnitt The standard type hierarchy), dessen start, stop und step Attribute die Werte der Ausdrücke sind, die als untere Grenze, obere Grenze bzw. Schritt angegeben werden, wobei fehlende Ausdrücke durch None ersetzt werden.

Kühne Betonung meins.

Sie können diese Konvertierung umgehen (von der Slice-Syntax zu slice() Objekten), indem Sie slice() Objekte direkt erstellen; Sie können sie bei Bedarf in Tupel setzen.

So

numpy_array_to_slice[160:300,28:43] 

entspricht

box = slice(160, 300), slice(28, 43) 
numpy_array_to_slice[box] 

ich das step Argument ausgelassen habe; Es ist standardmäßig None, wenn es weggelassen wird.

erweitern diese zu Ihrer Liste wäre:

listofindexvalues = [ 
    (slice(160, 300), slice(28, 43)), 
    (slice(160, 300), slice(40, 55)), 
    (slice(160, 300), slice(28, 43)) 
] 

for box in listofindexvalues: 
    sliced_array = numpy_array_to_slice[box] 
+0

Selbst wenn ich die Dokumentation lese, bin ich nicht sicher, dass ich es so leicht verstanden hätte. Danke nochmal, das ist perfekt! –

1

Sie sollten eine Liste von slice Instanzen (oder Tupel davon), keine Strings.

Hier ist ein Beispiel.

>>> import numpy as np 
>>> 
>>> listofindexvalues = [(slice(1, 6), slice(3, 4))] 
>>> a = np.arange(100).reshape(10,10) 
>>> a[listofindexvalues[0]] 
array([[13], 
     [23], 
     [33], 
     [43], 
     [53]]) 

a[listofindexvalues[0]] entspricht a[1:6, 3:4] in diesem Fall.

>>> a[1:6, 3:4] 
array([[13], 
     [23], 
     [33], 
     [43], 
     [53]]) 
+1

Super, danke! –