Python 二维numpy数组,其中项目之间的间距由函数定义

Python 二维numpy数组,其中项目之间的间距由函数定义,python,arrays,numpy,distribution,Python,Arrays,Numpy,Distribution,我需要一个最小值和最大值之间的整数列表或2-d数组,其中整数之间的间隔根据分布函数反向变化。换句话说,在分布的最大值处,密度应该最高。在我的例子中,像k参数为1.5的Weibull概率密度函数这样的函数会更好。 输出如下所示: >>> min = 1 >>> max = 500 >>> peak = 100 >>> n = 18 >>> myfunc(min, max, peak, n) [1, 50, 7

我需要一个最小值和最大值之间的整数列表或2-d数组,其中整数之间的间隔根据分布函数反向变化。换句话说,在分布的最大值处,密度应该最高。在我的例子中,像k参数为1.5的Weibull概率密度函数这样的函数会更好。 输出如下所示:

>>> min = 1
>>> max = 500
>>> peak = 100
>>> n = 18
>>> myfunc(min, max, peak, n)
[1, 50, 75, 88, 94, 97, 98, 99, 100, 102, 106, 112, 135, 176, 230, 290, 360, 500]

我已经尝试过一种方法,使用
np.random.weibull()
函数填充numpy数组,但效果并不理想;当产生20个项目的列表时,随机化意味着间距不令人满意。最好避免从分布中生成随机数,而是按照上面所述直接控制间距。 多谢各位

编辑:我提到威布尔分布是因为它是不对称的,但当然,任何给出类似结果的类似分布函数也可以,并且可能更合适

Edit2:所以我想要一个numpy非线性空间


Edit3:正如我在一条评论中回答的那样,我希望避免随机数生成,这样每次使用相同的输入参数运行函数时,它的输出都是相同的

如果我正确理解了您的问题,此函数应该满足您的要求:

def weibullspaced(min, max, k, arrsize):
    wb = np.random.weibull(k, arrsize - 1)
    spaced = np.zeros((arrsize,))
    spaced[1:] = np.cumsum(wb)
    diff = max - min
    spaced *= diff / spaced[-1]
    return min + np.rint(spaced)

你当然可以在任何你想要的分布中替换,但是你说你想要威布尔分布。这就是你要找的函数吗?

这是我自己问题的一个不合法但简单的解决方案。我用三角形分布函数简化了事情。这很好,因为很容易指定最小值和最大值。名为“spacing()”的函数根据指定的数学函数提供x值的间距量。在通过while循环递增之后,我将Max值添加到列表中,以便显示整个范围。然后,我在转换为numpy数组时转换为整数

这种方法的缺点是我必须手动指定最小和最大步长。我宁愿指定返回数组的长度

import numpy as np
import math

Min = 1.0
Max = 500.0
peak = 100.0

minstep = 1.0
maxstep = 50.0


def spacing(x):
    # Triangle distribution:
    if x < peak:
        # Since we are calculating gradients I keep everything as floats for now. 
        grad = (minstep - maxstep)/(peak - Min)
        return grad*x + maxstep
    elif x == peak:
        return minstep
    else:
        grad = (maxstep-minstep)/(Max-peak)
        return grad*x + minstep

def myfunc(Min, Max, peak, minstep, maxstep):
    x = 1.0
    chosen = []
    while x < Max:
        space = spacing(x)
        chosen.append(x)
        x += space
    chosen.append(Max)

    # I cheat with the integers by casting the list to ints right at the end: 
    chosen = np.array(chosen, dtype = 'int')
    return chosen

print myfunc(1.0, 500.0, 100.0, 1.0, 50.0)

不确定您所说的“按上述说明执行”是什么意思,因为您没有给出
myfunc
的代码,也没有指定某些间距可能“不令人满意”的方式。我下面的尝试是我能猜到的最接近你的意思。嗨,谢谢你的努力。我所说的“我上面描述的”只是指我对输出应该是什么的描述。myfunc()只是一个产生正确输出的假想函数。是否尝试使用这些节点参数化分布?对我来说,还不清楚“足够好”或“不满意”是什么意思。当使用随机数生成时,每次运行函数时,列表值都是不同的。我希望它们每次都是一样的。此外,对于小样本量,不能保证“均匀”间距;我想要的是一个间距,就像线性的,但缩放到一个函数。请看我自己的答案,也许会更清楚。谢谢你,这是一个有用的函数,但是我的问题提到避免随机数生成。每次使用相同的输入参数调用函数时,结果列表应该是相同的。事实上,我在原始帖子中没有看到您提到输出应该是非随机的。我仍然不清楚间距函数应该是什么。例如,有一个
peak
参数,在您的输出中,似乎有一些集群在100左右,但我仍然不清楚这个问题。可能是备份:假设我输入的最小值为0,最大值为100,输出数组为50,什么是可接受的输出数组,什么不是?
峰值是否允许所有值?或者if必须介于min和max之间?如果peak=1、20或450,我们的输出会受到什么约束?“最好避免从分布中生成随机数[…]”好的,也许我应该更清楚,对不起。你可能对算法感兴趣。您生成节点的方式与生成表的方式类似。谢谢,我来看看
[  1  50  75  88  94  97  99 100 113 128 145 163 184 208 235 264 298 335  378 425 478 500]