Python 生成指数增长的数字列表(从开始到停止)
我想在开始数和结束数之间生成一个指数递增的数字列表 因此,我想举个例子: 开始数量=700000 结束数=750000 步骤数=100 并生成一个包含100个数字的列表,大致如下:[7000070000100700250700700….74600075000] 我可以用np.arange对等距间隔进行此操作,甚至可以用np.logspace对稍微呈指数增长的间隔进行此操作,但使用此方法,增加的清晰度是不够的 理想情况下,我还可以控制距离增加的幅度\\Python 生成指数增长的数字列表(从开始到停止),python,list,Python,List,我想在开始数和结束数之间生成一个指数递增的数字列表 因此,我想举个例子: 开始数量=700000 结束数=750000 步骤数=100 并生成一个包含100个数字的列表,大致如下:[7000070000100700250700700….74600075000] 我可以用np.arange对等距间隔进行此操作,甚至可以用np.logspace对稍微呈指数增长的间隔进行此操作,但使用此方法,增加的清晰度是不够的 理想情况下,我还可以控制距离增加的幅度\\ 谢谢您的时间。正如我在评论中所说,您的前提在
谢谢您的时间。正如我在评论中所说,您的前提在数学上有缺陷。从本质上讲,给定固定的开始、停止和num_步骤,您需要一个等式,这是数学,而不是python 带边界条件
f(0) = start
f(num) = stop
对于仅有的两个常数——系数A和基数b,这是相对容易的:
所以,如果我们选择了开始、停止和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^cb^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))
输出可以看到,增加底面会增加曲线的曲率
[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. ]
我编写了一个简单的代码,它将根据您选择的因子增加步长,就像在本例中,当它结束时,步长将增加2。不幸的是,如果你想控制因素,你必须牺牲完全在停止时着陆。希望它能帮助您解决问题。请尝试以下代码:
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)
此代码依赖于数字位置,它可以递增生成数字增加指数的因素是什么?我认为在固定的起点和终点之间工作时,不可能出现指数递增变化。问题是你需要不同的方程y=Ab^x,但是A和b是两个变量,只依赖于开始和结束。i、 e.对于任何开始、结束,您都可以求解唯一的方程y=fx=Ab^x s.t.f0=start和fnum_steps=end。对数空间中的锐度随基数的增加而增加。@Goyo不,不,看我的answer@FHTMitchell对,我想把数字之间的距离设为指数,而不是数字本身。这当然不是同一件事,但OP一开始似乎指的是后者,最后似乎指的是前者。。为什么不从fx=a+b^x开始呢?对我来说,这类问题似乎更符合逻辑,因为你可以通过仔细观察问题来解决a:f0=699999+b^0。剩下要做的就是通过边界条件b^99=50K+1来确定b,或者我在这里遗漏了什么?因为fx=a+b^x不是,因为它不满足方程df/dx=Cfx。如果OP很乐意使用一个指数间距和一个常数位移a,那么你可以做OP想要做的事情,因为你在方程gx=a+Cb^x中有三个常数,这将允许你改变一个,大概是b。哦,好的观点。。。根据这项任务的提出地点,可能会有一个严格的定义。呃,当然这会生成数字,但它们的间隔是均匀的,所以与x成线性。顺便说一句:只需定义一个函数def fx:return 700000+x*101并调用它,就可以创建相同的numlist,比如:对于range100中的i:numlist.appendfic我们可以在程序中使用随机数吗?例如,我们将随机数附加到生成的数字中?当然可以:您只需要从random import randint导入randint这样的随机函数,然后使用它:my_list.appendRandInt0100添加一个介于0和100之间的数字。
[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. ]
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]
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)