【问题标题】:Generating a list of numbers based on a constraint-step procedure基于约束步骤过程生成数字列表
【发布时间】:2016-01-18 15:46:05
【问题描述】:

我正在尝试使用以下代码生成一个包含 8 个数字的列表:

import numpy as np
import pandas as pd

n2 = np.random.uniform(0.1, 1.5)
c2 = np.random.uniform(4,14)
c3 = np.random.uniform(0.1,2.9)
ic4 = np.random.uniform(0.01,1)
nc4 = np.random.uniform(0.01,1)
ic5 = np.random.uniform(0,0.2)
nc5 = np.random.uniform(0,0.01)

comp_list = []

for i in range(1):
    if n2/c2 <= 0.11:
        comp_list.append(c2)
        comp_list.append(n2)
    if c3/c2 <= 0.26:
        comp_list.append(c3)
    if ic4/c3 <= 0.27:
        comp_list.append(ic4)
    if nc4/ic4 <= 1:
        comp_list.append(nc4)
    if ic5/nc4 <= 0.06:
        comp_list.append(ic5)
    if nc5/ic5 <= 0.25:
        comp_list.append(nc5)

    sum = n2+c2+c3+ic4+nc4+ic5+nc5
    c1 = 100-sum
    comp_list.append(c1)

df = pd.Series(comp_list)

print df

但是,当我运行代码时,输​​出的数字数量并不一致,范围可以从 3 到 5。例如,1 运行会给我:

0     1.560
1     0.251
2     0.008
3     86.665

第二次运行会给我:

0     12.929
1     1.015
2     2.126
3     0.093
4     0.0025
5     83.376

我不知道为什么输出不一致。

也许我需要遍历随机分布,直到满足所有 if 语句?还是我遗漏了一些明显的东西?

【问题讨论】:

  • 因为你用np.random.uniform()生成随机数?
  • 我需要随机生成的数字来满足约束(即
  • 你没有解释你想要做什么或你期望什么。
  • 我想要一组随机生成的数字来满足我设置的约束。例如,我从 n2 开始并检查 n2/c2 是否
  • 那么为什么你认为你的输出是错误的?你期望得到什么?

标签: python numpy pandas random


【解决方案1】:

您希望将所有内容包含在一个 while 循环中。滚动你所有的号码。如果它们都满足您的条件,请创建必要的列表。只要不满足其中一个条件,所有号码都将重新计算。

您要重新滚动所有数字的原因是它们彼此独立。例如,c2 涉及n2/c2c3/c2。如果满足n2/c2 并且您保留这两个数字,则为满足条件c3/c2 可以拥有的c3 的值受您已经为c2 选择的值的约束。

import numpy as np

while True:
    n2 = np.random.uniform(0.1, 1.5)
    c2 = np.random.uniform(4,14)
    c3 = np.random.uniform(0.1,2.9)
    ic4 = np.random.uniform(0.01,1)
    nc4 = np.random.uniform(0.01,1)
    ic5 = np.random.uniform(0,0.2)
    nc5 = np.random.uniform(0,0.01)

    if (n2/c2 <= 0.11 and
        c3/c2 <= 0.26 and
        ic4/c3 <= 0.27 and
        nc4/ic4 <= 1 and
        ic5/nc4 <= 0.06 and
        nc5/ic5 <= 0.25):

        comp_list = [n2, c2, c3, ic4, nc4, ic5, nc5]
        comp_list.append(100 - sum(comp_list))
        break

编辑:为了生成此类列表的列表,请根据需要多次迭代此代码并每次都附加comp_list 的结果。

big_list = []
for _ in range(10):
   # while stuff
   big_list.append(comp_list)

如果这是您希望在代码中的不同位置运行的东西,您不妨将它放在一个函数中。

def generate_numbers():
    while True:
        ...
    return comp_list

然后你可以做big_list = [generate_numbers() for _ in range(10)]

【讨论】:

  • 非常感谢您的回复。请问如何多次运行while循环以获得一组说10个列表(pandas数据框中的10行?
  • 太棒了!这帮助很大!
  • @Joey 我在代码中有一个小错误。我的意思是[generate_numbers() for _ in range(10)]。我错过了 generate_numbers 之后的括号,它不会调用该函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多