首页 > 解决方案 > 如何使用模零找到最接近给定值的除数

问题描述

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

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

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

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

import numpy as np

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

np.split(x, 1440)

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

标签: pythonpandasnumpy

解决方案


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

  1. 获取相关数字的所有除数
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]
  1. 返回最接近的除数
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)应该可以。


推荐阅读