2016-07-11 35 views
4

Ich habe eine Matrix der Form 4 x 129. Ich versuche, eine horizontale Spaltung wie das Beispiel unten zu tun:Python: Numpy Matrix split

In [18]: x = np.arange(4*129) 

In [19]: x = x.reshape(4, 129) 

In [20]: x.shape 
Out[20]: (4, 129) 

In [21]: y = np.hsplit(x, 13) 

ValueError: array split does not result in an equal division 

Ich verstehe, dass es nicht zu gleichen Teilen in 13 aufspalten will ich nicht Null-Pad eine Spalte mehr und dividieren tun um 13 .

ich will die x Matrix in 13 kleine Matrizen aufzuteilen, wobei die jeweils 12 aufgeteilt in eine Größe von 4 x 10 und der letzte sein sollte sollten in der Größe von 4 x 9 sein.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

5

Sie können die Indizes für Split und in diesem Fall passieren Sie können sie einfach erstellen np.arange() mit:

>>> a = np.hsplit(x, np.arange(12, 129, 12)) 
>>> 
>>> a[0].shape 
(4, 12) 
>>> a[-1].shape 
(4, 9) 
+0

Dank @kasramvd – Rangooski

2

Ich weiß nicht, wie es zu tun mit einem int als zweiten Parameter mit np.hsplit, aber Während ich mich umsah, fand ich einen Weg, dies mit einem Array als Parameter zu tun.

Die Art und Weise zu tun sei:

temp_array = [(i+1)*10 for i in range((129-1)//10)] 
y = np.hsplit(x,temp_array) 

oder in einer Zeile:

y = np.hsplit(x,[(i+1)*10 for i in range((129-1)//10)]) 

Edit: hinzugefügt -1 während das Array zu schaffen, bei der die Erzeugung eines leeren Arrays zu verhindern, Ende von x, wenn die Größe des ursprünglichen Arrays ein Vielfaches der Größe des gewünschten Unterarrays ist;

Edit2: eine andere Art und Weise die temp_array zu schaffen

temp_array = np.arange(10,129,10) 

ist alles in einer Zeile Putting:

y = np.hsplit(x,np.arange(10,129,10)) 

Edit3: Fand heraus, gibt es ein Problem mit python3 war (wurde mit python2 Prüfung): Das Ergebnis einer int-Division kann ein float sein. Verwenden Sie // anstelle von / für die Division, um sicherzustellen, das Ergebnis ist ein int

Erläuterung: Ich erstelle ein Array ('splitting_array') mit jedem Vielfachen der Größe des Sub-Array möchte ich streng zwischen 0 und der Größe des ursprünglichen Arrays.
Ich spaltete dann das ursprüngliche Array mit dem 'Splitting_array'. Laut dem Dokument für numpy.split teilt es das original_array entlang der horizontalen Achse bei den Indizes, die von 'splitting_array' angegeben werden.
Also, in unserem Fall wird die original_array vor jedem Index, der ein Vielfaches von 10 ist.

+0

Pls überprüfen Sie Ihre Antwort. Es zeigt 'TypeError: 'float' -Objekt kann nicht als eine ganze Zahl interpretiert werden ' – Rangooski

+0

Dieses Problem behoben, war es wegen meiner grundlegenden Division, die ein int zurückgibt, wenn die beiden Elemente sind int in Python2.7, sondern ein float in python3. Ersetzt durch eine int_division in meiner Antwort. – HolyDanna

+0

Das ist großartig HolyDanna :). – Rangooski

Verwandte Themen