将数组分割成相等大小的窗口

7
我正在尝试将长度为40的numpy.array分割成大小相等的小的numpy.array,小数组的数量由用户指定。在小数组之间允许有重叠,因为在一些情况下,只有通过小数组的重叠才能使整个长度被分成指定的份数。
例如,如果我有一个数组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
相反地:这些函数确实做了你所说它们不会做的事情。展示一下你得到的输出和你想要的输出。 - Arya McCarthy
添加了一个示例,给出了 numpy.split - Somthin
1
array_split的文档说明它可以处理不均匀的分割;而split则会抛出错误。 - Arya McCarthy
增加了有关 numpy.array_split 的示例和期望输出。 - Somthin
是的... @aryamccarthy - Somthin
3个回答

3

啊,那很有道理...滑动窗口...然后我只需要找到一种方法来确定步幅...以便它与我想要的子数组数量匹配。 - Somthin
我认为我在回答的最后部分已经解决了这个问题。在你的问题中,你说一个由40个元素组成且有37个子组的数组应该得到宽度为3,但实际上需要是4。公式是 len(a) - n_groups + 1 - Arya McCarthy

0
这是另一种在窗口大小下拆分数组的方法。
from numpy.lib.stride_tricks import sliding_window_view

def unfold(array, size, step):
    """
    params:
       array: 1d array 
       size : size of each chunk
       step : windowing size
    """
    assert array.ndim == 1, f"Not implemented yet, expecting 1d array but got {array.ndim}d"
    return sliding_window_view(array, window_shape=size)[::step]

在这里找到更多信息


0

numpy.split() 应该生成大小精确符合函数第二个输入参数 indices_or_sections 所指定大小的子数组。 您如何尝试使用分裂函数? 如果要将数组 arr 分成大小为 5 的 4 个子数组,请使用:

numpy.split(arr,4)

你的示例失败的原因是数组大小必须能够被你想要的数组数量整除。这是有道理的,因为只有在元素数目除以子数组数目为整数时才能分成相等的大小。
现在你已经澄清了你的问题,我认为没有简单的解决方案。将数组分成相等大小的组很容易,但如果用户从40个元素中请求37个重叠允许的相等大小的组,那么有多种方法可以做到这一点,而你没有给出确定这些方法的标准来帮助你。对于你所寻找的任务,不会有任何简单的numpy函数,你需要一个搜索算法(DFS?)来确定如何将集合分成37(或任何所需的数量)个相等大小的组。

我不想指定数组的大小,我只想提供我想要的子数组数量。 - Somthin
关于不可分割的问题。允许重叠。因此应该是可分割的。 - Somthin
我从来没有说过你需要指定数组的大小,现在我看到有关重叠部分的内容,并认为你需要一个搜索算法来解决这个问题。 - Matthew Ciaramitaro
尝试使用一种算法构建N个子数组,首先选择所有大小为1的数组,当无法生成N时,通过使所有重叠大小为2的数组增加长度,然后逐个使它们不重叠,测试大小为N,如果失败则转到大小为3并继续直到大小为N,此时引发异常。当然,有更有效的方法,但我不会深入讨论。DFS链接在这里,还有在这里 - Matthew Ciaramitaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接