2015-01-21 2 views
1

죄송합니다. 내 수학은 환상적이지 않으므로 나와 함께 감내해야합니다.값의 전반적인 증가/감소를 유지하면서 비율의 시퀀스를 범위로 제한 함

내가 3의 비율 제한을 가지고 있다고 가정 해 봅시다. 저는 비율로 곱해질 크기의 배열이 있고 비율 중 일부는 제한 내에 있으며 그 중 일부는 제한 내에 있으며 일부는 제한되지 않습니다. '티.

한도를 초과하는 비율이 필요하며 한도를 초과 한 비율을 줄이기 위해 한도 아래의 비율을 늘려야합니다. 결과는 크기의 합이 여전히 동일하지만 각각의 크기는 더 제한보다 의해 변경되지 않은 것

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 

한계를 이전에 초과 한 비율이 줄었고 보상 비율을 낮추었습니다.

+4

질문을 세 번 다시 읽었으며 정확히 무엇을하고 싶은지에 대해 아직 명확하지 않습니다. 아마도 당신은 당신이 원하는 결과물을 포함시킬 수 있습니까? – NPE

+0

죄송합니다. 정말 힘들어요. 그 편집 도움이 전혀? – PerryS89

답변

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 조건으로 처리됩니다.

관련 문제