我正试着对神经元网络的数据集进行预处理。因此,我需要将形状(2040906,1)的数组重塑为批数组。
我需要一个大约1440行的批次大小,但是2040906显然不能被这个数字除以(剩余的零)。
我试着计算除法的模数,并删除与余数一样多的行,这样除法将导致模值为零。但是,删除数据集中的行不是我想要做的。
因此,这是一个再现问题的示例片段。
import numpy as np
x = np.ones((2040906, 1))
np.split(x, 1440)对于我来说,最好的解决方案是某种函数,它为一个余数为0的给定值返回最近的除数。
发布于 2019-07-22 23:19:38
由于两个原因,寻找最大除数不是一种很好的方法。
更好的方法是从整个数据集中随机选取样本来填充数据集,使其可被最佳批次大小整除。下面是计算可被1440整除的填充数组大小的简单技巧。
(-x.shape % 1440) + x.shape
然而,当数据被排序时(如时间序列),则不能使用填充,因为无法构造填充数据的有代表性的内容。
另一种解决办法是尽量减少截断的数据。一个人可以搜索一个范围,一个可用的填充,以找到需要最小的截断。
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这种方法很好,因为它允许很好地利用数据并使用适合于培训的填充。
发布于 2019-07-22 23:37:12
不确定这是最优雅的解决方案,但您可以执行以下操作:
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)应该可以工作。
发布于 2021-08-13 04:25:25
另一种寻找最近的大除数或最近的小除数的解决方案。
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.0https://stackoverflow.com/questions/57154745
复制相似问题