2015-11-10 7 views
5

Ich habe ein Array von Zahlen, deren Form 26*43264 ist. Ich würde dies gerne in ein Array von Form 208*208 aber in Stücke von 26*26 umformen.Array in ein quadratisches Array umformen Python

[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[10,11,12,13,14,15,16,17,18,19]] 

wird so etwas wie:

[[0, 1, 2, 3, 4], 
[10,11,12,13,14], 
[ 5, 6, 7, 8, 9], 
[15,16,17,18,19]] 
+0

seit '43264 = 208 * 208' könnten Sie Ihr Array zu einer Form von' 26 * 208 * 208' umformen, aber nicht '208 * 208 * 26 * 26' – toine

+0

Suchen Sie einfach nach' np.reshape (list (4,5))? – SirParselot

+0

Just np.reshape (Liste, (4,5)) funktioniert nicht, weil es die Daten falsch segmentiert. – Chidwack

Antwort

3

Diese Art der Umformungsfrage ist schon mal aufgetaucht. Aber anstatt Suche demonstate Ich werde schnell ein numpy Ansatz

Ihre Probe Array machen:

In [473]: x=np.arange(20).reshape(2,10) 
In [474]: x 
Out[474]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]) 

Verwenden reshape aufzuspalten es in Blöcke von 5

In [475]: x.reshape(2,2,5) 
Out[475]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

und verwenden transponieren Dimensionen neu zu ordnen und in der Tat diese Reihen

In [476]: x.reshape(2,2,5).transpose(1,0,2) 
Out[476]: 
array([[[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14]], 

     [[ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]]) 

neu ordnen und eine andere Form zum Nachteil olidate die ersten 2 Dimensionen

In [477]: x.reshape(2,2,5).transpose(1,0,2).reshape(4,5) 
Out[477]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

Wenn x ist bereits ein numpy Array, diese umzusetzen und umformen Operationen sind billig (Zeit weise). Wenn x wirklich verschachtelte Listen waren, dann wird die andere Lösung mit Listenoperationen schneller sein, da die Erstellung eines numpy Arrays Overhead hat.

1

Ein wenig hässlich, aber hier ist ein Einzeiler für das kleine Beispiel, dass Sie sollten für die volle Größe eines ändern können:

In [29]: from itertools import chain 

In [30]: np.array(list(chain(*[np.arange(20).reshape(4,5)[i::2] for i in xrange(2)]))) 
Out[30]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

EDIT: Hier ist eine verallgemeinerte Version in einer Funktion. Uglier-Code, aber die Funktion nimmt nur ein Array und eine Anzahl von Segmenten, mit denen Sie enden möchten.

In [57]: def break_arr(arr, chunks): 
    ....:  to_take = arr.shape[1]/chunks 
    ....:  return np.array(list(chain(*[arr.take(xrange(x*to_take, x*to_take+to_take), axis=1) for x in xrange(chunks)]))) 
    ....: 

In [58]: arr = np.arange(40).reshape(4,10) 

In [59]: break_arr(arr, 5) 
Out[59]: 
array([[ 0, 1], 
     [10, 11], 
     [20, 21], 
     [30, 31], 
     [ 2, 3], 
     [12, 13], 
     [22, 23], 
     [32, 33], 
     [ 4, 5], 
     [14, 15], 
     [24, 25], 
     [34, 35], 
     [ 6, 7], 
     [16, 17], 
     [26, 27], 
     [36, 37], 
     [ 8, 9], 
     [18, 19], 
     [28, 29], 
     [38, 39]]) 

In [60]: break_arr(arr, 2) 
Out[60]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19], 
     [25, 26, 27, 28, 29], 
     [35, 36, 37, 38, 39]]) 
+0

Also wie würde dies angepasst werden, um mit einem größeren Array von ganzen Zahlen zu arbeiten? – Chidwack

+0

Die Änderung sollte es ein wenig einfacher zu bedienen machen. –

+0

Perfekt! Vielen Dank – Chidwack