2017-04-10 78 views
3

我試圖將長度爲40的numpy.array拆分成更小的,相同大小的numpy.array s,其中較小數組的數目由用戶給出。它允許在較小的陣列之間有一些重疊,因爲情況可能會發生在全長只能被小陣列的某種形式重疊的分割整除的情況下。拆分成相等大小的窗口陣列

如果我有一個數組np.array([range(40)]) 我不得不把它分成37個個子陣列,子陣的名單應該是這樣的:

[1, 2, 3], [3, 4, 5], [5, 6, 7], ... [38, 39, 40] 

我嘗試使用numpy.split但是這隻能在長度可被大小整除,而numpy.array_split會產生不均勻的大小。

例使用numpy.split

>> import numpy as np 
>>> a = np.random.randint(6,size=(40)) 
>>> b = np.split(a,37) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/shape_base.py", line 508, in split 
    'array split does not result in an equal division') 
ValueError: array split does not result in an equal division 

而且隨着numpy.array_split

>>> a = np.random.randint(5,size=(40)) 
>>> b = np.array_split(a,37) 
>>> print len(b) 
37 
>>> print b[0].shape 
(2,) 
>>> print b[3].shape 
(1,) 
>>> print b[5].shape 
(1,) 
>>> print b[6].shape 
(1,) 
>>> print b[30].shape 
(1,) 
>>> 

numpy.array_split不平分他們。

任何解決方案?

+1

相反:這些功能你說他們不明白到底是什麼。向我們顯示你得到的輸出和你想要的輸出。 –

+0

加給'numpy.split' – Somthin

+1

'array_split'的文件說,它處理不均勻分裂的例子。 'split'旨在引發錯誤。 –

回答

2

什麼你所描述的被稱爲(滑動)窗口,而不是分裂。

看到這個答案:https://stackoverflow.com/a/15722507/7802200

你想要的是使用與len(a) - n_splits + 1一個width開發那裏的window_stack功能。

+0

啊。這是有道理的..滑動窗口..然後我只是需要一種方式,我可以確定的步幅..這樣,它與我想要的子陣列的數量相匹配 – Somthin

+0

我想我解決了我的答案的最後部分。在你的問題中,你說過一個由37個子組組成的數組,應該給你一個3的寬度,但實際上它應該是4.它是'len(a) - n_groups + 1'。 –

0

numpy.split()應該生成大小與參數indices_or_sections中指定的大小完全相同的子數組,這是該函數的第二個輸入。 你怎麼嘗試使用拆分功能? 如果你想在陣列arr分成4個子陣列尺寸5,使用

numpy.split(arr,4) 

的原因,你的失敗例子是,數組的大小必須是你想要的數組數整除。這是有道理的,因爲當元素數除以子陣列的數量是一個整數時,你只能分裂成相等的大小。

現在你已經澄清你的問題,我覺得沒有簡單的解決方案。很容易將數組分成相同大小的組,但是如果用戶從一組40個同時請求37個同樣大小的組並且允許重疊,則有多種方法可以做到這一點,並且您沒有給我們確定這樣的標準方法來幫助你。對於您正在尋找的任務,不會有任何簡單的numpy功能,您需要一個搜索算法(DFS?)來弄清楚如何將該組分成37個(或任何請求的)同樣大小的組。

+0

我不想指定數組..我只是想爲它提供子陣列我想要的數量的大小。 – Somthin

+0

關於不可分割。重疊是允許的。所以它應該是可分的。 – Somthin

+0

我從來沒有說過你需要指定數組的大小,而且我現在看到重疊部分,並認爲你需要一個搜索算法。 –