我正在使用生成器函数和itertools.product来创建有序数字列表,以便创建每个可能的数字配对:
def gen(lowerBound, upperBound, stepSize = 1):
for steppedVal in np.arange(lowerBound, upperBound, stepSize):
yield steppedVal
for vectors in it.product(gen(3,6), gen(10,30,5)):
print(vectors)
结果如预期,生成了这样的数据集:
(3, 10)
(3, 15)
(3, 20)
(3, 25)
(4, 10)
(4, 15)
(4, 20)
(4, 25)
(5, 10)
(5, 15)
(5, 20)
(5, 25)
然而,我的问题在于接下来的步骤。我想在生成器函数中添加一个子句,用一个范围内的随机数替换步进值。当我尝试以下代码时:
def gen(useRandom, lowerBound, upperBound, stepSize = 1):
if useRandom:
randomVal = random.uniform(lowerBound, upperBound)
yield randomVal
else:
for steppedVal in np.arange(lowerBound, upperBound, stepSize):
yield steppedVal
for vectors in itertools.product(gen(True,3,6), gen(False,10,30,5)):
print(vectors)
我明白您的意思,这并不是我想要的:
我得到了这个结果,但这并不是我想要的:
(4.4163620543645585, 10)
(4.4163620543645585, 15)
(4.4163620543645585, 20)
(4.4163620543645585, 25)
如何修改这段代码,以使数据集中的每个随机数都是唯一的,而不必在事后更改数据集,因为这会增加巨大的计算开销。 (实际数据集包含十几个变量,每个变量有10-20个步骤)。
编辑说明,以下是所需输出:
(4.1802347587349857, 10)
(3.7128578913746897, 15)
(5.8912734809721957, 20)
(4.4163620543645585, 25)
编辑2,为了更加明确,我不想使用zip函数,因为这也应该是可能的输出:
for vectors in itertools.product(gen(True,3,6), gen(False,10,30,5), gen(False,5,10):
print(vectors)
(Some Random Number, 10, 5)
(Some Random Number, 10, 6)
(Some Random Number, 10, 7)
(Some Random Number, 10, 8)
(Some Random Number, 10, 9)
(Some Random Number, 15, 5)
(Some Random Number, 15, 6)
(Some Random Number, 15, 7)
(Some Random Number, 15, 8)
(Some Random Number, 15, 9)
(Some Random Number, 20, 5)
(Some Random Number, 20, 6)
(Some Random Number, 20, 7)
(Some Random Number, 20, 8)
(Some Random Number, 20, 9)
(Some Random Number, 25, 5)
(Some Random Number, 25, 6)
(Some Random Number, 25, 7)
(Some Random Number, 25, 8)
(Some Random Number, 25, 9)
第二个和第三个产生器的每一对仍然存在,这是关键部分。
4.41...
的值变成 3 到 6 之间的随机数吗? - Patrick Haughitertools.product(gen(False,3,6), gen(False,10,30,5), gen(False,5,10))
将会有345=60个输出,但是看起来你想要的是product(gen(True), gen(False), gen(False))
,它将会有4*5=20个输出。我不认为你只用product
就能得到你想要的效果。你需要使用随机生成器和zip
。 - mtrwzip(random_gen, product(range1, range2))
这样的代码应该可以得到你想要的结果。 - mtrw