将一系列比率限制在一个范围内,同时保持它们相乘的总体值 increase/decrease
Limiting a sequence of ratios to a range whilst maintaining overall increase/decrease of values they are multiplying
对不起,我的数学不是很好,所以你得忍受我。
假设我的比率限制为 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
条件处理的。
对不起,我的数学不是很好,所以你得忍受我。
假设我的比率限制为 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
条件处理的。