【问题标题】:Split array into equal sized windows将数组拆分为大小相等的窗口
【发布时间】:2017-09-04 22:31:48
【问题描述】:

我正在尝试将长度为 40 的numpy.array 拆分为更小、大小相等的numpy.arrays,其中较小数组的数量由用户给出。允许在较小的数组之间有一些重叠,因为在给定较小数组的某种重叠形式的情况下,可能会出现全长只能被分割整除的情况。

如果我有一个数组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 不要平分它们。

有什么办法吗?

【问题讨论】:

  • 恰恰相反:这些功能完全按照您所说的去做。向我们展示你得到的输出和你想要的输出。
  • 添加了给定numpy.split的示例
  • array_split 的文档说它可以处理不均匀的分割; split 旨在引发错误。
  • numpy.array_split 上添加了示例和所需的输出。
  • 是的...@aryamccarthy

标签: python arrays numpy


【解决方案1】:

您所描述的称为(滑动)窗口,而不是拆分。

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

您想要的是使用那里开发的window_stack 函数和widthlen(a) - n_splits + 1

【讨论】:

  • 啊。这很有意义.. 滑动窗口.. 那么我只需要一种方法来确定步幅.. 使其与我想要的子数组的数量相匹配
  • 我想我在答案的最后部分解决了这个问题。在您的问题中,您说包含 37 个子组的 40 个数组应该让您的宽度为 3,但实际上需要为 4。它是 len(a) - n_groups + 1
【解决方案2】:

numpy.split() 应该生成大小与参数indices_or_sections 中指定的大小完全相同的子数组,该参数是函数的第二个输入。 您如何尝试使用拆分功能? 如果要将数组arr拆分为 4 个大小为 5 的子数组,请使用

numpy.split(arr,4)

您的示例失败的原因是数组大小必须能被您想要的数组数整除。这是有道理的,因为只有当元素数除以子数组数为整数时,才能拆分成相等的大小。

既然您已经澄清了您的问题,我认为没有简单的解决方案。将数组分成大小相等的组很容易,但如果用户从一组 40 个允许重叠的组中请求 37 个大小相等的组,则有不止一种方法可以做到这一点,而您没有给我们提供确定此类的标准方法来帮助你。对于您正在寻找的任务,没有任何简单的 numpy 函数,您需要一个搜索算法(DFS?)来弄清楚如何将集合分成 37 个(或任何要求的)大小相等的组。

【讨论】:

  • 我不想指定数组的大小。我只想提供我想要的子数组的数量。
  • 关于不可分割。允许重叠。所以应该是可分的。
  • 我从来没有说过你需要指定数组的大小,我现在看到了关于重叠的部分,并认为你需要一个搜索算法。
  • 尝试使用一种算法构建N个子数组,首先选择所有大小为1的数组,然后当它无法产生N时,它通过使所有重叠大小为2来增加长度,然后使它们不重叠一次一个,测试 N 的大小,如果失败则转到大小 3 并继续,直到大小 N 引发异常。当然,会有一些方法可以提高效率,但我不会深入探讨。 DFS 链接 herehere
【解决方案3】:

如果你想用窗口大小分割数组,这是另一种方法

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]

查找更多here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多