2016-07-11 294 views
4

我有一個矩陣形狀4 x 129。我試圖像例如水平分割如下的事:Python:Numpy矩陣分割

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 

我明白,它不能同樣將它分成13我不想用13做零墊一個多列和分裂。

我想將x矩陣分割成13個個小矩陣,其中每個12分割應在4 x 10尺寸,最後一個應當在4 x 9大小。

有沒有什麼辦法可以這樣做?

回答

5

您可以通過指數分裂,在這種情況下,你可以簡單地使用np.arange()創建它們:

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

謝謝@kasramvd – Rangooski

2

我不知道如何使用np.hsplit有一個int第二個參數做到這一點,但同時環顧四周,我找到了一種使用數組做爲參數的方法。

做的方式,它是:

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

或一條線:

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

編輯:添加-1在創建陣列,以防止在空數組的創建當原始數組的大小是我們想要的子數組大小的倍數時,x的末尾;

EDIT2:另一種方式來創建temp_array是

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

在一行將所有內容:

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

EDIT3:發現外面有使用python3(使用python2測試)中的問題: int分割的結果可以是一個浮點數。使用//代替/爲師,以確保結果是一個int

說明:我創建一個數組(「splitting_array」)與子數組的大小每多想0和大小之間嚴格的原始數組。
然後我使用'splitting_array'拆分原始數組。根據numpy.split的文檔,它將在由'splitting_array'給出的索引處沿橫軸分割original_array。
因此,在我們的例子中,original_array將在每個索引是10的倍數之前分割。

+0

請檢查您的答案。它顯示'TypeError:'float'對象不能被解釋爲一個整數 ' – Rangooski

+0

解決了這個問題,這是由於我做了一個基本的劃分,如果兩個元素在python2.7中爲int,而返回一個int,在python3中。在我的答案中用int_division替換它。 – HolyDanna

+0

這是偉大的HolyDanna :)。 – Rangooski