2016-06-16 24 views
-1

Ich kann wirklich nicht genau sagen, wie Masken in Numpy funktionieren.Wie man eine quadratische Maske in numpy erzeugt und anwendet

erstelle ich eine Maske wie

import numpy 
def make_mask(center_x,center_y,len_x,len_y): 
     x,y = numpy.ogrid[:len_x, :len_y] 
     mask = (center_x-x)**2 + (center_y-y)**2 
     return mask 

Dann versuche ich es

>>>a = numpy.ones((10,10)) 
>>>mask = make_mask(2,2,2,2,2) 
>>>a[mask] = 0 
>>>a 
array([[1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [0,0,0,0,0,0,0,0], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [0,0,0,0,0,0,0,0], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [0,0,0,0,0,0,0,0]]) 

zu verwenden, was ich erwartet hatte war so etwas wie

>>>a 
array([[1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [1,1,0,0,1,1,1,1], 
     [1,1,0,0,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1], 
     [1,1,1,1,1,1,1,1]]) 

Ich versuche, habe ein paar verschiedene Versionen der Funktion. Ich kann das gewünschte Verhalten nicht erreichen. Was mache ich falsch. Ich verstehe wirklich nicht, wie eine 2D-Matrix eine 2D-Matrix indiziert.

+1

Könnten Sie alle schreiben dein Code? Momentan definiert Ihre 'make_mask'-Funktion nicht' center_x' oder 'center_y' und funktioniert nicht wie vorgesehen. Es sei denn, Sie haben gemeint, dass 'center_x' und' center_y' 'index_x' und' index_y' sind. Wie auch immer, es funktioniert nicht so, wie Sie es bereitgestellt haben. –

+1

Außerdem gibt es einen fünften Parameter in Ihrem Aufruf 'make_mask'. – Benjamin

+0

Aber ich denke, was Sie suchen, ist Slice-Notation: http://StackOverflow.com/Questions/509211/Explain-Pythons-Slice-Notation. Ich würde diesen Link auschecken, ich glaube, das wird helfen. –

Antwort

2

Ihre Maske setzt die 2., 5. und 8. Reihe auf 0; Das Array wird abgeflacht, da es nicht die gleiche Form wie das Array hat, das es maskiert. Es wird angewendet, wie:

a[2] = 0 
a[5] = 0 
a[8] = 0 

Ich glaube, Sie waren etwas mehr wie erwartet:

mask = numpy.ones_like(a) 
mask[center_y:center_y + len_y, center_x:center_x + len_x] = 0 

, die die gleiche Größe wie das Array Sie Tring zu maskieren und gibt das erwartete Ergebnis.

+0

Danke. Ich glaube, ich verstehe Python-Array-Slicing trotzdem nicht. – Valarauca

0

Wenn Sie einen Blick darauf werfen, was Ihre make_mask funktioniert, wenn wie folgt geschrieben:

def make_mask(index_x,index_y,len_x,len_y): 
     x,y = numpy.ogrid[:len_x, :len_y] 
     mask = (index_x-x)**2 + (index_y-y)**2 
     return mask 

Sie werden sehen, dass Sie

array([[8, 5], 
     [5, 2]]) 

und wenn Sie Index eine 10x10 Matrix mit dem bekommen 2x2-Matrix, ich glaube, es behandelt alle Werte in dieser Matrix als Indexierung der größeren Matrix nach Zeilen. Aus diesem Grund sehen Sie die 2. Reihe mit Nullen, die 5. Reihe mit Nullen und die 8. Reihe mit Nullen.

Um den Effekt zu erhalten, die Sie wünschen, können Sie einfach die Indizes verwenden, die Sie haben, Sie brauchen nicht einmal eine Funktion:

a[startx:startx+lenx, starty:starty+leny] = 0 

die gibt:

array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 0., 0., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 0., 0., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], 
     [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]) 
Verwandte Themen