Python: 生成不均匀间隔的数组

4
我想生成一个由下限和上限值限定且包含n个元素的数组,类似于以下示例:
def my_lin(lb, ub, steps):
    dx = (ub-lb) / (steps-1)
    return [lb + i*dx for i in range(steps)]

my_lin(0,10,11)

但我希望更多的数值接近于较低的值,一种谐波间距。我不想要对数间距。

我猜这很简单,但我无法想出来。非常感谢任何帮助。

编辑:

我想到了以下快速解决方案:

def harm_series(lb,n):
    return [float(lb)/float(i) for i in range(1,n) ]

1
也许这个链接可以帮助你。 - Lawrence Benson
是的,数学1学期。很久以前的事了。。 - Moritz
但我不明白为什么它必须被踩。 - Moritz
可能是因为人们希望看到一次尝试并帮助解决错误,而不是为某人编写代码... - Lawrence Benson
1
有时候很难找到正确的词语,比如“调和级数”,而谷歌搜索也无济于事。但我会用我的解决方案更新问题。 - Moritz
1个回答

3

[0,1] 区间内找到一个函数 f,使其具有所需的间隔(注意应满足 f(0)==0f(1)==1),然后应用公式 f(i*dx/(ub-lb))*(ub-lb)

个人喜欢使用幂函数,但还有其他选择。例如,可以尝试这个:

def my_lin(lb, ub, steps, spacing=1.1):
    span = (ub-lb)
    dx = 1.0 / (steps-1)
    return [lb + (i*dx)**spacing*span for i in range(steps)]

lin = my_lin(0, 10, 11)
print lin
# visualize the spacing
print ''.join(' '*int(2*a)+'*' for a in lin)

输出:

[0.0, 0.7943282347242814, 1.702679845041569, 2.6597044516956405, 3.6497741462219233, 4.665164957684037, 5.701201299034059, 6.754727665838724, 7.823462148343428, 8.905673323855929, 10.0]
* *   *     *       *         *           *             *               *                 *                    *

现在使用参数spacing,它的工作原理如下:
  • 越接近零,您的值就越集中在ub周围
  • 离1越远进入另一个方向,它们就越聚集在lb周围
  • 如果spacing恰好为1,则它们是等距的

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接