将一系列比率限制在一个范围内,同时保持它们相乘的值的总体增加/减少

时间:2015-01-21 10:59:20

标签: python python-2.7 numpy

对不起,我的数学并不太棒,所以你不得不忍受我。

我们说我的比率限制为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

先前高于限额的比率已经降低,并且已经提高了以下比率以补偿。

1 个答案:

答案 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条件处理。