拆分成相等大小的窗口阵列

问题描述:

我试图将长度为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'旨在引发错误。 –

什么你所描述的被称为(滑动)窗口,而不是分裂。

看到这个答案:https://*.com/a/15722507/7802200

你想要的是使用与len(a) - n_splits + 1一个width开发那里的window_stack功能。

+0

啊。这是有道理的..滑动窗口..然后我只是需要一种方式,我可以确定的步幅..这样,它与我想要的子阵列的数量相匹配 – Somthin

+0

我想我解决了我的答案的最后部分。在你的问题中,你说过一个由37个子组组成的数组,应该给你一个3的宽度,但实际上它应该是4.它是'len(a) - n_groups + 1'。 –

numpy.split()应该生成大小与参数indices_or_sections中指定的大小完全相同的子数组,这是该函数的第二个输入。 你怎么尝试使用拆分功能? 如果你想在阵列arr分成4个子阵列尺寸5,使用

numpy.split(arr,4) 

的原因,你的失败例子是,数组的大小必须是你想要的数组数整除。这是有道理的,因为当元素数除以子阵列的数量是一个整数时,你只能分裂成相等的大小。

现在你已经澄清你的问题,我觉得没有简单的解决方案。很容易将数组分成相同大小的组,但是如果用户从一组40个同时请求37个同样大小的组并且允许重叠,则有多种方法可以做到这一点,并且您没有给我们确定这样的标准方法来帮助你。对于您正在寻找的任务,不会有任何简单的numpy功能,您需要一个搜索算法(DFS?)来弄清楚如何将该组分成37个(或任何请求的)同样大小的组。

+0

我不想指定数组..我只是想为它提供子阵列我想要的数量的大小。 – Somthin

+0

关于不可分割。重叠是允许的。所以它应该是可分的。 – Somthin

+0

我从来没有说过你需要指定数组的大小,而且我现在看到重叠部分,并认为你需要一个搜索算法。 –