对不起,我的数学不是很好,所以你必须忍受我。
假设我的比率限制为 3。我有一个要乘以比率的 numpy 大小数组和一个比率的 numpy 数组,其中一些在限制范围内,其中一些不在限制范围内。
我需要将高于限制的比率设置为限制,并将低于限制的比率增加到限制,以考虑超过限制的比率的减少。结果将是大小的总和仍然相同,但单个大小的更改没有超过限制
In [1]: import numpy as np
In [2]: sizes = np.array([2.0,4.0,6.0,8.0,10.0])
In [3]: ratios = np.array([0.5, 0.5, 5.0, 4.0, 0.5])
In [4]: print np.sum(sizes * ratios)
70.0
#result after limiting ratios would still be 70
编辑:因此,在上面的例子中,结果比率将是:
np.array([1.75, 1.75, 3.0, 3.0, 1.75])
In [4]: print np.sum(sizes * ratios)
70.0
以前高于限额的比率已降低,低于限制的比率已提高以补偿。
我想你正在寻找这样的东西:
import numpy as np
def Spread_Ratios(ratios,sizes):
if np.dot(ratios,sizes)/np.sum(sizes)>3.:
print 'There is no solution!n'
return None
if np.any(ratios>3.):
score = np.dot(sizes,ratios)
ratios_reduced = np.where(ratios>3.,3.,ratios)
score_reduced = np.dot(sizes,ratios_reduced)
delta_ratios = (score - score_reduced) / np.sum(sizes[ratios<3.])
new_ratios = ratios_reduced + np.where(ratios<3.,delta_ratios,0.)
return Spread_Ratios(new_ratios,sizes)
else:
return ratios,sizes
递归定义是必要的,因为低于 3(但接近)的权重可能会提升到 3 以上。
此外,可能根本不存在解决方案。这种情况以第一个if
条件处理。