Python 概率列表创建
以下问题:有一个基三元组(0,1,0) 现在,我尝试创建一个给定范围内已更改的三元组列表 制约因素: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,
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”子句)等价于一对嵌套循环。