我想生成一个开始和结束之间的数字指数递增列表。
因此,例如,我将采取:
start_num = 700,000
end num = 750,000
num_steps = 100
并生成一个由100个数字组成的列表,大致如下:[700000,700100,700250,700700.....746000,750000]
我可以使用np.arange
在均匀间隔的时间间隔内执行此操作,或者甚至可以使用np.logspace
进行指数级增加,但是这种方法的增加“尖锐度”还不够。
理想情况下,我还可以控制距离的增加幅度。\\
感谢您的时间。
答案 0 :(得分:2)
正如我在评论中所说,您的前提在数学上是有缺陷的。本质上,您想要给定固定的start
,stop
和num
(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)
因此,如果我们选择start
,stop
和num
,我们将求解方程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)
此代码取决于数字位置,并且可以递增生成数字