2016-07-31 18 views
0

Die folgende ist eine Funktion, die Sub-Matrizen von zwei gegebenen Matrizen zurückgeben kann. Die Position zum Erzeugen dieser Submatrizen ist für beide Eingangsmatrizen gleich. Die Eingabe-Matrizen sind von Numpy array. Ich würde nur gerne wissen, ob es elegantere Möglichkeiten gibt, die gleiche Art von Aufgabe zu erfüllen, wie diese Funktion bietet.der effiziente Ansatz zum Erzeugen von Submatrizen

def seg(ma1,ma2,size): 
    rowN = len(ma1)   
    colN = len(ma1[0])   
    dim1 = random.randint(0,rowN-size) 
    dim2 = random.randint(0,colN-size) 
    return ma1[dim1:dim1+size,dim2:dim2+size], ma2[dim1:dim1+size,dim2:dim2+size] 
+0

Das einzige, was meiner Meinung nach "Eleganz" hinzufügen würde, ist '(rowN, colN) = ma1.size'. –

Antwort

0

Als alternativer Ansatz, könnten wir die Indizierung Bereiche mit np.ix_ und Index in die Eingabefelder mit denen, wie so schaffen -

idx = np.ix_(np.arange(size)+dim1,np.arange(size)+dim2) 
out = ma1[idx], ma2[idx] 

Einem anderen Ansatz vorgeschlagen np.mgrid verwendet werden könnte, um Erstellen Sie die dichten Zeilen- und Spaltenindizes. Dies würde mehr Speicher benötigen als der vorherige, aber wahrscheinlich näher am ursprünglichen Code, wenn auch kürzer. Hier ist, wie es aussehen würde -

R,C = np.mgrid[dim1:dim1+size,dim2:dim2+size] 
out = ma1[R,C], ma2[R,C] 

andere Art und Weise zu „shift“ die Eleganz in np.mgrid und schiebt Arbeitsbelastung in dieser Indizierung Teil wie so wäre -

R,C = np.mgrid[:size,:size] 
out = ma1[R+dim1,C+dim2], ma2[R+dim1,C+dim2] 
0

Sie wahrscheinlich tun wollen rowN, colN = ma1.shape statt

rown = len (MA1)
coln = len (MA1 [0])

auch Sie m Ich möchte deinen Zufallsgenerator erzeugen.

Verwandte Themen