生成指数级增长的数字列表(从开始到结束)

时间:2018-08-20 08:02:52

标签: python list

我想生成一个开始和结束之间的数字指数递增列表。

因此,例如,我将采取: start_num = 700,000 end num = 750,000 num_steps = 100

并生成一个由100个数字组成的列表,大致如下:[700000,700100,700250,700700.....746000,750000]

我可以使用np.arange在均匀间隔的时间间隔内执行此操作,或者甚至可以使用np.logspace进行指数级增加,但是这种方法的增加“尖锐度”还不够。

理想情况下,我还可以控制距离的增加幅度。\\

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

正如我在评论中所说,您的前提在数学上是有缺陷的。本质上,您想要给定固定的startstopnum(num_steps个)方程(这是数学,不是 python)

y = f(x) = Ab^x

带有“边界条件”

f(0) = start
f(num) = stop

现在,仅用两个常数-系数A和基数b相对容易解决:

f(0) = Ab^0 = A => A = start

f(num) = start * b^(num) => b = (stop / start) ^ (1 / num)

因此,如果我们选择startstopnum,我们将求解方程y中的所有常数。没有任何变化,因此您必须始终获得相同的结果。

这可以通过以下操作看到:

import numpy as np
import math

for b in range(2, 6):
    # np.logspace takes start and stop as the exponent of base
    # so use math.log for consistency -- same as np.geomspace
    print(np.logspace(math.log(2, b), math.log(10, b), num=5, base=b))

输出

[ 2.          2.99069756  4.47213595  6.68740305 10.        ]
[ 2.          2.99069756  4.47213595  6.68740305 10.        ]
[ 2.          2.99069756  4.47213595  6.68740305 10.        ]
[ 2.          2.99069756  4.47213595  6.68740305 10.        ]

编辑:

n.b。给定的方程式是一般的指数方程式-任何形式为y = ab^(kx + c)的方程式都可以重写为y = (ab^c)(b^k)^x = AB^x

请注意,这不包括非指数方程y = C + Ab^x(请参见注释)。如果要将此版本与可变基数一起使用,则此功能可以解决问题

def varlogspace(start, stop, num, base, **kwargs):
    n = num - 1
    c = (start - stop) / (1 - base**n)
    a = start - c
    def f(x):
        return a + (c * base**x)
    return np.fromfunction(f, (num,), **kwargs)


for b in range(2, 6):
    print(varlogspace(2, 5, 5, base=b))

输出(请注意,增加base会增加曲线的曲率)

[2.  2.2 2.6 3.4 5. ]
[2.    2.075 2.3   2.975 5.   ]
[2.         2.03529412 2.17647059 2.74117647 5.        ]
[2.         2.01923077 2.11538462 2.59615385 5.        ]

答案 1 :(得分:0)

start = 0
stop = 100
factor = 2
step = 0
numlist = []

while start < stop:
    numlist.append(start)
    step += factor
    start += step    

print(numlist)

# Output
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

我制作了这个简单的代码,根据您选择的因素增加了步长,在这种情况下,直到结束时步长增加了2。不幸的是,如果您想控制该因子,则必须牺牲精确的停靠着陆。希望它能帮助您解决问题。

答案 2 :(得分:0)

尝试以下代码:

num=0
numlist=[]
for i in range(700000,750000):
    if num==100:
        break

    if i+num*100>750000:
        num=num/2
    numlist.append(i+num*100)
    num+=1
print(numlist)  

此代码取决于数字位置,并且可以递增生成数字