2016-04-11 5 views
0

Ich habe ein Problem zu lösen und ich kann keine gute Lösung finden.Python-Nummernfelder. Wie schneidet man mehrere Arrays auf effiziente Weise ab?

Um es zu erleichtern habe ich ein Array von 10x10 und ich möchte "kleine Arrays" von 3x3 herausschneiden. Im Moment kann ich dies folgendermaßen:

array = np.arange(100).reshape((10,10)) 

patch = np.array(array[:3, :3] 

for n in range(3, 10, 3): 
    for m in range(3, 10, 3): 
     patch = numpy.append(patch, array[n:n+3, m:m+3] 

i im Grunde die numpy Array-Patch mit der ersten Scheibe erstellen und fügen Sie alle anderen Scheiben danach. Das Problem dabei ist, dass es fürchterlich langsam ist und die Sloping-Möglichkeiten von numpy nicht gut nutzt. Ich muss dies für eine große Anzahl viel größerer Arrays tun. Kann mir jemand einen Rat geben, wie man das effizienter macht? 1000 danke!

+0

warum append 'patch'? Wenn patch ein Slice ist, dh "patch = array [n: n + 3, m: m + 3]", werden alle auf "patch" geänderten Werte auf "array" geändert. Wenn es ein Speicherproblem ist, würde ich vorschlagen, in [dask] (http://dask.pydata.org/en/latest/) –

+0

hi und danke für Ihre Antwort. Was ich am Ende haben möchte, ist ein Array (Patch), das alle 3 × 3 Slices enthält, die auf dem großen Array-Array möglich sind. Ich mache dies auf die hässliche Art und Weise, das Array mit einem Eintrag (Slice 1) zu erstellen, um die richtigen Dimensionen zu erhalten (ich verwende in meiner Arbeit mehrdimensionale Arrays) und hänge danach alle anderen Slices an. sagst du in der Art, wie ich es tue, ändere ich auch Array? Ich will das nicht tun, Array sollte unabhängig von Patch sein – idontknow

+0

Ich sehe immer noch nicht ganz, warum Sie das Array in Patches aufteilen wollen, oder warum es ein Problem ist, dass Patch ändert diesen Teil des Arrays. Wenn Sie append verwenden, ohne die Achse zu setzen, drehen Sie Ihr 2D-Array in 1d, glaube ich. Könnten Sie versuchen, anhand eines einfachen Beispiels zu zeigen, was Sie tun möchten? –

Antwort

0

Ihr Problem ist ganz auf die Verwendung numpy.append. append erstellt bei jeder Verwendung ein neues Array. Wenn Ihr Patch-Array größer wird, wird dies immer länger dauern.

Verwenden Sie stattdessen ein vordefiniertes Array (Sie kennen bereits die endgültige Größe des Patch-Arrays) und vermeiden Sie die Erstellung von Zwischenkopien von Daten.

# setup 
x, y = 999, 999 
array = np.arange(x * y) 
array.shape = x, y 
little_array_size = 3 

# creates an array of "little arrays" 
patch = np.empty(array.size, dtype=int) 
patch.shape = -1, little_array_size, little_array_size 

i = 0 
for n in range(0, array.shape[0], little_array_size): 
    for m in range(0, array.shape[1], little_array_size): 
     # uses view, so data is copied straight from array to patch 
     patch[i,:] = array[n:n+little_array_size, m:m+little_array_size] 
     i += 1 

patch.shape = -1 # flattens array 

Die oben nimmt etwa ein Drittel der zweiten auf meinem Computer (zwei Größenordnungen schneller als die Verwendung von numpy.append (20+ Sekunden)).

+0

ach das war es wonach ich suchte. Vielen Dank, habe es hundert Mal schneller arbeiten lassen. – idontknow

Verwandte Themen