如何使用模零找到最接近给定值的除数

Ste*_*ven 6 python numpy pandas

我正在尝试为神经元网络预处理数据集。因此,我需要将形状为 (2040906, 1) 的数组重塑为批次数组。

我需要大约 1440 行的批量大小,但 2040906 显然不能被该数字整除(余数为零)。

我试图只计算除法的模数并删除与余数一样多的行,因此除法将导致模数为零。但是删除数据集的行不是我想要做的。

所以这是一个重现问题的示例片段。

import numpy as np

x = np.ones((2040906, 1))

np.split(x, 1440)
Run Code Online (Sandbox Code Playgroud)

对我来说,完美的解决方案是某种函数,它返回余数为 0 的给定值的最近除数。

tst*_*isl 2

由于两个原因,寻找最大除数并不是一个好方法。

  1. 数组的大小可能是素数。
  2. 除数可能太大或太小,导致学习效率低下。

更好的想法是用从整个数据集中随机选择的样本填充数据集,使其可被最佳批量大小整除。这是计算可被 1440 整除的填充数组大小的简单技巧

(-x.shape[0] % 1440) + x.shape[0]

然而,当数据是有序的(如时间序列)时,则不能使用填充,因为无法构造填充数据的代表性内容。

另一种解决方案是最小化截断数据。人们可以搜索可用填充的范围,以找到需要最少截断的情况。

def find_best_divisor(size, low, high, step=1):
    minimal_truncation, best_divisor = min((size % divisor, divisor)
        for divisor in range(low, high, step))
    return best_divisor
Run Code Online (Sandbox Code Playgroud)

这种方法很好,因为它可以很好地利用数据并使用适合训练的填充。