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

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

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

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

import numpy as np

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

np.split(x, 1440)

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

最佳答案

不确定这是最优雅的解决方案,但您可以执行以下操作:

  • 获取有关数字的所有除数

  • def getDivisors(n, res=None) :
        res = res or []
        i = 1
        while i <= n :
            if (n % i==0) :
                res.append(i),
            i = i + 1
        return res
    
    getDivisors(2040906)
    Out[4]:
    [1,
     2,
     3,
     6,
     7,
     14,
     21,
     42,
     48593,
     97186,
     145779,
     291558,
     340151,
     680302,
     1020453,
     2040906]
    
  • 返回最接近的除数

  • def get_closest_split(n, close_to=1440):
        all_divisors = getDivisors(n)
        for ix, val in enumerate(all_divisors):
            if close_to < val:
                if ix == 0: return val
                if (val-close_to)>(close_to - all_divisors[ix-1]):
                    return all_divisors[ix-1]
                return val
    
    def get_closest_split(n, close_to=1440)
    Out[6]: 42
    

    在您的情况下,将返回 42 作为最接近 1440 的唯一除数。因此,np.split(x, 42) 应该可以工作。

    关于python - 如何使用模零找到最接近给定值的除数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57154745/

    10-12 21:17