2017-03-15 3 views
2

Ich suche nach einer Möglichkeit, in der ich eine for-Schleife durch eine größere Matrix iterieren kann, in der jede Iteration eine Untermatrix der Größe (Zeile, Spalte, Tiefe) ausgeben wird (6, 3,3).Iterate in Submatrizen durch eine größere Matrix

Meine große Matrix wird als numpy Matrix gespeichert, und es wäre auch möglich, dass jede Iteration als solche ausgegeben wird.

>>> import numpy as np 
>>> a = np.random.rand(6*3,3*3,3) 
>>> print a.shape 
(18, 9, 3) 
>>> print a 
>>> b 

Die Variable b sollte alle Untermatrizen der Größe (6,3,3) aus der Matrix a enthalten. Jede Untermatrix sollte nicht mit dem vorherigen überlappen.

enter image description here

+0

Suchen Sie nach Gleitmatrizen? Wie viele Dimensionen befinden sich im Eingabe-Array? Könnten Sie einen Beispielfall hinzufügen? – Divakar

+0

Ja ... ich könnte es eine Schiebe-Matrix nennen .. Die Dimension gut .. Zeilen sind immer 78 (teilbar mit 6). Spalten hängt von der Datenlänge ab, aber immer teilbar mit 3, und Tiefe ist 3 (eigentlich 4 RGBA, aber ich schneide den Alpha-Kanal weg) –

+0

Also, wie viele solche Submatrizen sollen Sie von den soeben bearbeiteten Beispieldaten bekommen? – Divakar

Antwort

2

Ansatz # 1

ich, dass wir für non-overlapping/distinct Blöcke suchen gehe davon aus.

from skimage.util.shape import view_as_blocks 

BSZ = (6,3,3) 
out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ)) 

Probelauf - -

In [279]: a = np.random.rand(6*3,3*3,3) 

In [280]: out = view_as_blocks(a,BSZ).reshape((-1,)+ (BSZ)) 

In [281]: out.shape 
Out[281]: (9, 6, 3, 3) 

Ansatz # 2

Mit nur nativen NumPy Tools wie reshaping und transpose, hier ist ein Weg, als solche wir Scikit-image's view_as_blocks Dienstprogramm nutzen könnten -

m,n,r = a.shape 
split_shp = m//BSZ[0], BSZ[0], n//BSZ[1], BSZ[1], r//BSZ[2], BSZ[2] 
out = a.reshape(split_shp).transpose(0,2,4,1,3,5).reshape((-1,)+ (BSZ)) 
+0

Ich versuchte Ansatz # 1 und bekam diese Warnung? –

+0

'/usr/local/lib/python2.7/dist-packages/skimage/util/shape.py:94: RuntimeWarning: Kann Ansichten auf einem nicht zusammenhängenden Eingabearray nicht bereitstellen, ohne zu kopieren. warnen (RuntimeWarning ("Kann keine Ansichten auf eine nicht zusammenhängende Eingabe bieten" –

+0

Etwas, über das ich mir Sorgen machen sollte? –