首页 > 解决方案 > 生成指数增长的数字列表(从开始到停止)

问题描述

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

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

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

我可以对均匀间隔的间隔执行此操作,np.arange甚至略微呈指数增加,np.logspace但这种方法的增加的“锐度”是不够的。

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

谢谢你的时间。

标签: pythonlist

解决方案


正如我在评论中所说,你的前提在数学上是有缺陷的。基本上你想要,给定 fixed和start( num_steps) 一个方程(这是数学,不是python)stopnum

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,我们将求解方程中的所有常数。没有什么可以改变的,所以你必须总是得到相同的结果。stopnumy

这可以通过以下方式看到:

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.        ]

推荐阅读