2017-03-01 2 views
2

Ich habe ein Bild als ein Array (img) dargestellt, und ich möchte viele Kopien des Bildes machen, und in jeder Kopie Null verschiedene Quadrate des Bildes (in der ersten Kopie Nullstellen 0: 2,0: 2 in der nächsten Kopie Nullstellen 0: 2, 3: 5 usw.). Ich habe np.broadcast_to verwendet, um mehrere Kopien des Bilds zu erstellen, aber ich habe Probleme beim Indexieren über die mehreren Kopien des Bildes und die mehreren Positionen innerhalb der Bilder, um Quadrate innerhalb des Bildes auf Null zu setzen.Indizierung durch ein Array in Blöcken

Ich denke, ich bin auf der Suche nach etwas wie skimage.util.view_as_blocks, aber ich muss in der Lage sein, in das ursprüngliche Array zu schreiben, nicht nur zu lesen.

Die Idee dahinter ist, alle Kopien des Bildes durch ein neurales Netzwerk zu übergeben. Die Kopie, die am schlechtesten abschneidet, sollte die mit der Klasse (Bild) sein, die ich an ihrem Nullpunkt identifizieren will.

img = np.arange(10*10).reshape(10,10) 
img_copies = np.broadcast_to(img, [100, 10, 10]) 
z = np.zeros(2*2).reshape(2,2) 

Dank

+0

Wie sind solche 'verschiedene squares' mit' verschiedenen locations' an den Code eingespeist? Würden alle diese Quadrate die gleiche Form haben? – Divakar

+0

Editierte Originalpost um genauer zu sein. Die verschiedenen Quadrate würden in der oberen linken Ecke beginnen und in einer nicht überlappenden Weise das gesamte Array abdecken. Jedes Quadrat hätte die gleiche Größe. Danke – Aryeh

Antwort

0

Ich glaube, ich es geknackt haben! Hier ist ein Ansatz masking entlang einer 6D umgestalteten Array -

def block_masked_arrays(img, BSZ): 
    # Store shape params 
    m = img.shape[0]//BSZ 
    n = m**2 

    # Make copies of input array such that we replicate array along first axis. 
    # Reshape such that the block sizes are exposed by going higher dimensional. 
    img3D = np.tile(img,(n,1,1)).reshape(m,m,m,BSZ,m,BSZ)  

    # Create a square matrix with all ones except on diagonals. 
    # Reshape and broadcast it to match the "blocky" reshaped input array. 
    mask = np.eye(n,dtype=bool).reshape(m,m,m,1,m,1) 

    # Use the mask to mask out the appropriate blocks. Reshape back to 3D. 
    img3D[np.broadcast_to(mask, img3D.shape)] = 0 
    img3D.shape = (n,m*BSZ,-1) 
    return img3D 

Probelauf -

In [339]: img 
Out[339]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [340]: block_masked_arrays(img, BSZ=2) 
Out[340]: 
array([[[ 0, 0, 2, 3], 
     [ 0, 0, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]], 

     [[ 0, 1, 0, 0], 
     [ 4, 5, 0, 0], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]], 

     [[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 0, 0, 10, 11], 
     [ 0, 0, 14, 15]], 

     [[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 0, 0], 
     [12, 13, 0, 0]]]) 
+0

Das funktioniert, obwohl ich Probleme habe, Ihrem Code zu folgen, besonders mit der höheren Dimensionalität. Wie funktioniert deine Funktion? Danke – Aryeh

+0

@Aryeh Hinzugefügt einige Kommentare dort. – Divakar

+0

Ihre Funktion hat funktioniert, also habe ich dies als beantwortet markiert. Vielen Dank. Ich verstehe immer noch nicht, wie Sie die hinzugefügten Dimensionen verwendet haben, gibt es einen Namen für die Methode, die Sie verwendet haben, oder eine Website, die Sie empfehlen, damit ich mehr darüber erfahren kann, was Sie getan haben? Danke – Aryeh

Verwandte Themen