numpy中的递归减法
Recursive subtraction in numpy
考虑以下递归问题:假设我有 total_units
可以在 total_days
中花费的东西。在任何一天,当我花费这些单位时,我有 units_left
个单位,还剩下 days_left
个。基于此,我可以将 ideal_daily_rate
定义为 units_left/days_left
。
现在,让我们假设,从第一天开始,我们选择每天花费 20%
高于 ideal_daily_rate
。请注意,在任何一天的开始,ideal_daily_rate
总是 计算为 units_left/days_left
,我们只是选择多花 20% 的 ideal__daily_rate
在那个特定的日子。
目标是在给定初始条件 total_units
、total_days
和高于理想比率 20%
的情况下,获得我每天花费多少单位。
numpy
中是否有库可以帮助处理/向量化这种类型的递归?
让i = number of units
和N = total number of days
。连续几天后剩余的单位数是,
i1 = i0*(1-1.2/N)
i2 = i1*(1-1.2/(N-1)) = i0*(1-1.2/N)*(1-1.2/(N-1))
etc.
您可以使用以下方法在 numpy 中进行计算:
i = np.cumprod(1-1.2/np.arange(1,N+1)[::-1])*i0
我不明白为什么这需要递归。这是一个简短的模拟,用于获取您所描述的值。它本质上是一个衰减差分方程(微分方程的离散版本)。如果您认为我误解了什么,请纠正我。
days_left = 100
units_left = 50
ideal_daily_rate = units_left/days_left
spend = 1.2*ideal_daily_rate
while (days_left>0):
print( "days_left: %4.1f unit_left: %4.1f ideal: %5.2f spend: %5.2f" % (days_left,units_left,ideal_daily_rate,spend))
units_left -= spend
days_left -= 1
if (days_left>0):
ideal_daily_rate = units_left/days_left
spend = 1.2*ideal_daily_rate
这是另一种方式
def tock(days,units,perc_more):
loop = reversed(xrange(days+1)) #a little fanciness...
#probably not the best method
for day in loop:
if day == 0: break
ideal_rate = units/day
spend = ideal_rate * perc_more
print(spend)
units = units - spend
%timeit -n 10 tock(10,10,1.2)
考虑以下递归问题:假设我有 total_units
可以在 total_days
中花费的东西。在任何一天,当我花费这些单位时,我有 units_left
个单位,还剩下 days_left
个。基于此,我可以将 ideal_daily_rate
定义为 units_left/days_left
。
现在,让我们假设,从第一天开始,我们选择每天花费 20%
高于 ideal_daily_rate
。请注意,在任何一天的开始,ideal_daily_rate
总是 计算为 units_left/days_left
,我们只是选择多花 20% 的 ideal__daily_rate
在那个特定的日子。
目标是在给定初始条件 total_units
、total_days
和高于理想比率 20%
的情况下,获得我每天花费多少单位。
numpy
中是否有库可以帮助处理/向量化这种类型的递归?
让i = number of units
和N = total number of days
。连续几天后剩余的单位数是,
i1 = i0*(1-1.2/N)
i2 = i1*(1-1.2/(N-1)) = i0*(1-1.2/N)*(1-1.2/(N-1))
etc.
您可以使用以下方法在 numpy 中进行计算:
i = np.cumprod(1-1.2/np.arange(1,N+1)[::-1])*i0
我不明白为什么这需要递归。这是一个简短的模拟,用于获取您所描述的值。它本质上是一个衰减差分方程(微分方程的离散版本)。如果您认为我误解了什么,请纠正我。
days_left = 100
units_left = 50
ideal_daily_rate = units_left/days_left
spend = 1.2*ideal_daily_rate
while (days_left>0):
print( "days_left: %4.1f unit_left: %4.1f ideal: %5.2f spend: %5.2f" % (days_left,units_left,ideal_daily_rate,spend))
units_left -= spend
days_left -= 1
if (days_left>0):
ideal_daily_rate = units_left/days_left
spend = 1.2*ideal_daily_rate
这是另一种方式
def tock(days,units,perc_more):
loop = reversed(xrange(days+1)) #a little fanciness...
#probably not the best method
for day in loop:
if day == 0: break
ideal_rate = units/day
spend = ideal_rate * perc_more
print(spend)
units = units - spend
%timeit -n 10 tock(10,10,1.2)