首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求模为零的给定值的最近因子

如何求模为零的给定值的最近因子
EN

Stack Overflow用户
提问于 2019-07-22 23:02:08
回答 4查看 2.3K关注 0票数 7

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

我需要一个大约1440行的批次大小,但是2040906显然不能被这个数字除以(剩余的零)。

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

因此,这是一个再现问题的示例片段。

代码语言:javascript
复制
import numpy as np

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

np.split(x, 1440)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-22 23:19:38

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

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

更好的方法是从整个数据集中随机选取样本来填充数据集,使其可被最佳批次大小整除。下面是计算可被1440整除的填充数组大小的简单技巧。

(-x.shape % 1440) + x.shape

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

另一种解决办法是尽量减少截断的数据。一个人可以搜索一个范围,一个可用的填充,以找到需要最小的截断。

代码语言:javascript
复制
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

这种方法很好,因为它允许很好地利用数据并使用适合于培训的填充。

票数 2
EN

Stack Overflow用户

发布于 2019-07-22 23:37:12

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

  1. 获取有关数字的所有除数
代码语言:javascript
复制
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. 返回最近的除数
代码语言:javascript
复制
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)应该可以工作。

票数 4
EN

Stack Overflow用户

发布于 2021-08-13 04:25:25

另一种寻找最近的大除数或最近的小除数的解决方案。

代码语言:javascript
复制
import numpy as np

def get_whole_ceil(n,near):
    nn = np.divide(n,np.linspace(1,np.ceil(n/near),int(np.ceil(n/near))))
    return(nn[nn%1==0][-1])

def get_whole_floor(n,near):
    nn = np.divide(n,np.linspace(np.floor(n/near),n,int(n-np.floor(n/near)+1)))
    return(nn[nn%1==0][0])

get_whole_ceil(2040906,1440)

Out[1]: 48593.0

get_whole_floor(2040906,1440)

Out[1]: 42.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57154745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档