对不起,我的数学并不太棒,所以你不得不忍受我。
我们说我的比率限制为3。 我有一个大小不一的大小要乘以比率和一个比例的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
先前高于限额的比率已经降低,并且已经提高了以下比率以补偿。
答案 0 :(得分: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
条件处理。