python - 生成指数增长的数字列表(从开始到停止)
问题描述
我想在开始和结束数字之间生成一个呈指数增长的数字列表。
因此,例如,我会采取:
start_num = 700,000
end num = 750,000
num_steps = 100
并生成一个包含 100 个数字的列表,大致如下:[700000,700100,700250,700700.....746000,750000]
我可以对均匀间隔的间隔执行此操作,np.arange
甚至略微呈指数增加,np.logspace
但这种方法的增加的“锐度”是不够的。
理想情况下,我还可以控制距离增加的幅度。\\
谢谢你的时间。
解决方案
正如我在评论中所说,你的前提在数学上是有缺陷的。基本上你想要,给定 fixed和start
( num_steps) 一个方程(这是数学,不是python)stop
num
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)
因此,如果我们选择 a 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. ]
编辑:
注意给出的方程是一般指数方程——任何形式的方程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. ]
推荐阅读
- java - 有没有办法在Java中将颜色更改为不透明度
- javascript - 使用 true false 和 null 反应 Native setState 问题
- python-3.x - Python selenium + Crawlera - x509:由未知权威签署的证书
- python - 如何在火花中写入时更改csv文件名?
- xamarin.forms - 由于使用 SKGLView,返回 MainPage 时崩溃
- java - SpringBoot 如何知道哪个@Value 正在使用默认值?
- elasticsearch - 如何在弹性搜索中使 Country-State-City 类似搜索
- metadata - Exif GPS DestLatitude 与 Latitude 有什么区别
- javascript - 如何在 Nuxtjs 中的组件上获取路由元和所有路由元?
- jquery - JQuery.js 标签放置最佳实践 MVC .net