Python 概率列表创建

Python 概率列表创建,python,numpy,Python,Numpy,以下问题:有一个基三元组(0,1,0) 现在,我尝试创建一个给定范围内已更改的三元组列表 制约因素: 三元组[0]和三元组[2]的最大值应为r,例如r=0.2 和(三)=1 triple[0]不必等于triple[1],而应按给定的逐步参数s增加,如s=0.02 在上面提到的这个例子中,我们的方法应该创建 lst = [(0.0, 1, 0.0),(0.02, 0.98, 0.), (0.04, 0.96,0), (0.04,0.94, 0.02), (0.06,0.94,0), (0.06,

以下问题:有一个基三元组(0,1,0)

现在,我尝试创建一个给定范围内已更改的三元组列表

制约因素:

  • 三元组[0]和三元组[2]的最大值应为r,例如r=0.2
  • 和(三)=1
  • triple[0]不必等于triple[1],而应按给定的逐步参数s增加,如s=0.02
  • 在上面提到的这个例子中,我们的方法应该创建

    lst = [(0.0, 1, 0.0),(0.02, 0.98, 0.), (0.04, 0.96,0), (0.04,0.94, 0.02), (0.06,0.94,0), (0.06, 0.92, 0.02), (0.06, 0.9, 0.04), ...]
    
    有什么好办法吗

    也许您有一个想法,创建这些没有嵌套循环的列表(可能是使用numpy?)


    非常感谢

    您可以创建一个函数,使三元组如您所述。。。例如:

    def make_triple(r=0.2, s=0.02):
        element_one = round(random.uniform(0, r), 2)
        max_s = r/s
        element_three = random.randint(0, max_s) * s
        element_two = round(1 - element_one - element_three, 2)
        return (element_one, element_two, element_three)
    
    然后创建一个调用此函数的循环:

    list_of_triples = []
    for i in range(5):
        list_of_triples.append(make_triple(0.2, 0.02))
    

    就这样!无需嵌套循环。

    您可以创建一个函数,使三元组如您所述。。。例如:

    def make_triple(r=0.2, s=0.02):
        element_one = round(random.uniform(0, r), 2)
        max_s = r/s
        element_three = random.randint(0, max_s) * s
        element_two = round(1 - element_one - element_three, 2)
        return (element_one, element_two, element_three)
    
    然后创建一个调用此函数的循环:

    list_of_triples = []
    for i in range(5):
        list_of_triples.append(make_triple(0.2, 0.02))
    

    就这样!不需要嵌套循环。

    这里有一个列表理解,它应该提供满足您的约束条件的所有3元组(据我所知)。因为范围函数只接受整数,所以它比我想要的要笨重一点:

    r = 0.2
    s = 0.02
    steps = int(math.ceil(r/s))
    lst = [(a*s, 1-(a+b)*s, b*s) for b in range(steps) for a in range(steps)]
    
    结果:

    >>> lst[0:4]
    [(0.0, 1.0, 0.0), (0.02, 0.98, 0.0), (0.04, 0.96, 0.0), (0.06, 0.94, 0.0)]
    >>> lst[90:94]
    [(0.0, 0.8200000000000001, 0.18), (0.02, 0.8, 0.18), (0.04, 0.78, 0.18), (0.06, 0.76, 0.18)]
    

    在这段代码中,第一个和最后一个值仅上升到0.18,我不确定这是否合适(约束是
    r = 0.2
    s = 0.02
    steps = int(math.ceil(r/s))
    lst = [(a*s, 1-(a+b)*s, b*s) for b in range(steps) for a in range(steps)]
    
    结果:

    >>> lst[0:4]
    [(0.0, 1.0, 0.0), (0.02, 0.98, 0.0), (0.04, 0.96, 0.0), (0.06, 0.94, 0.0)]
    >>> lst[90:94]
    [(0.0, 0.8200000000000001, 0.18), (0.02, 0.8, 0.18), (0.04, 0.78, 0.18), (0.06, 0.76, 0.18)]
    

    在这段代码中,第一个和最后一个值只升到0.18,我不确定这是否合适(是约束scale是单个列的2D数组,因此可以方便地由
    .T
    进行转换。最后,3D数组被重塑为2D

    import numpy as np
    
    r = .2
    s = .02
    
    scale = np.arange(r, step=s, dtype=float).reshape(-1,1)
    a = np.empty((len(scale),len(scale),3), dtype=float)
    a[:,:,0] = scale
    a[:,:,2] = scale.T
    a[:,:,1] = 1 - a[:,:,0] - a[:,:,2]
    
    print a.reshape(-1,3)
    

    这是一个不带for循环的NumPy解决方案,根据要求。它使用3D数组和NumPy广播规则按行和列分配比例。
    scale
    是单个列的2D数组,因此它可以方便地由
    .T
    进行传输。最后,3D数组被重塑为2D

    import numpy as np
    
    r = .2
    s = .02
    
    scale = np.arange(r, step=s, dtype=float).reshape(-1,1)
    a = np.empty((len(scale),len(scale),3), dtype=float)
    a[:,:,0] = scale
    a[:,:,2] = scale.T
    a[:,:,1] = 1 - a[:,:,0] - a[:,:,2]
    
    print a.reshape(-1,3)
    

    另一个只是为了好玩的裸体回答:

    import numpy as np
    r = .2
    s = .02
    
    a, b = np.mgrid[0:r:s, 0:r:s]
    lst = np.dstack([a, 1 - (a+b), b]).reshape(-1, 3)
    

    另一个只是为了好玩的裸体回答:

    import numpy as np
    r = .2
    s = .02
    
    a, b = np.mgrid[0:r:s, 0:r:s]
    lst = np.dstack([a, 1 - (a+b), b]).reshape(-1, 3)
    


    你到底想做什么?你尝试了什么?非常复杂,但我需要这个列表来模拟切换参数你似乎暗示了三重[0]>三重[2]的约束……这是故意的吗?实际上没有这样的约束。如果不是t[0]=t[2],我只会添加反向元组最后。它就像:减少中间值,并将值任意分布到左侧和右侧,受sIs约束。有没有理由避免嵌套循环?似乎很容易通过大小s的步骤迭代从0到r的第一个和第三个值,然后通过从1中减去它们来计算中间值。你到底是什么尝试做什么?你尝试了什么?非常详细,但我需要这个列表来模拟切换参数。你似乎暗示了三重[0]>三重[2]的约束……这是故意的吗?实际上没有这样的约束。如果不是t[0]=t[2],我只会添加反向元组最后。它类似于:减少中间值,并将值任意分布到左侧和右侧,受sIs约束。有任何理由避免嵌套循环吗?似乎很容易通过大小s的步骤迭代从0到r的第一个和第三个值,然后通过从1中减去它们来计算中间值。此函数看起来是nice但不符合给定的约束条件我只是编辑了max_s变量以适应第三个元素小于r的收缩。我是否遗漏了另一个?此函数看起来不错,但不符合给定的约束条件我只是编辑了max_s变量以适应第三个元素小于r的收缩条件。是否遗漏了另一个?Nice回答!+1这是我所谓的“漂亮的解决方案”。我检查了调整是否仅为:“steps=int(math.ceil(r/s))+1”谢谢。如果r不是s的精确倍数,我认为无条件地加1是错误的。试试“steps=int(math.floor(r/s))+1”。在所有情况下,这将得到下一个更高的整数(即使除法后已经有一个整数)。另外,关于我对这个问题的评论,值得注意的是,列表理解(带有两个“for u in u”子句)相当于一对嵌套循环。回答不错!+1这就是我所说的“漂亮的解决方案”。我检查了tweak是否只有:“steps=int(math.ceil(r/s))+1”谢谢,如果r不是s的精确倍数,我认为无条件地加1是错误的。试试“steps=int(math.floor(r/s))+1”。在所有情况下,这将使你得到下一个更高的整数(即使除法后你已经有一个整数)。另外,关于我对这个问题的评论,值得注意的是列表理解(包括两个“for u in u”子句)等价于一对嵌套循环。