itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30) 杀死进程

Posted

技术标签:

【中文标题】itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30) 杀死进程【英文标题】:itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30) killed process 【发布时间】:2018-10-27 14:31:03 【问题描述】:

l 具有以下由 30 个嵌套 for 循环组成的功能。当我运行我的脚本时,我收到以下错误: SyntaxError: 静态嵌套块过多

函数有什么作用?

计算一组 31 个值 (x1,..,x31) 的配置,其值范围为 0 到 1,步长为 0.1,使得这 31 个值的总和等于 1.0。

我尝试了什么?

def compute_config():

    config = []
    for b1 in np.arange(0.0, 1.1, 0.1):
        for b2 in np.arange(0.0, 1.1, 0.1):
            for b3 in np.arange(0.0, 1.1, 0.1):
                for b4 in np.arange(0.0, 1.1, 0.1):
                    for b5 in np.arange(0.0, 1.1, 0.1):
                        for b6 in np.arange(0.0, 1.1, 0.1):
                            for b7 in np.arange(0.0, 1.1, 0.1):
                                for b8 in np.arange(0.0, 1.1, 0.1):
                                    for b9 in np.arange(0.0, 1.1, 0.1):
                                        for b10 in np.arange(0.0, 1.1, 0.1):
                                            for b11 in np.arange(0.0, 1.1, 0.1):
                                                for b12 in np.arange(0.0, 1.1, 0.1):
                                                    for b13 in np.arange(0.0, 1.1, 0.1):
                                                        for b14 in np.arange(0.0, 1.1, 0.1):
                                                            for b15 in np.arange(0.0, 1.1, 0.1):
                                                                for b16 in np.arange(0.0, 1.1, 0.1):
                                                                    for b17 in np.arange(0.0, 1.1, 0.1):
                                                                        for b18 in np.arange(0.0, 1.1, 0.1):
                                                                            for b19 in np.arange(0.0, 1.1, 0.1):
                                                                                for b20 in np.arange(0.0, 1.1, 0.1):
                                                                                    for b21 in np.arange(0.0, 1.1, 0.1):
                                                                                        for b22 in np.arange(0.0, 1.1,0.1):
                                                                                            for b23 in np.arange(0.0,1.1, 0.1):
                                                                                                for b24 in np.arange(0.0, 1.1, 0.1):
                                                                                                    for b25 in np.arange(0.0, 1.1,  0.1):
                                                                                                        for b26 in np.arange(0.0,1.1,0.1):
                                                                                                            for b27 in np.arange(0.0,1.1,0.1):
                                                                                                                for b28 in np.arange(0.0,1.1,0.1):
                                                                                                                    for b29 in np.arange(0.0,1.1,0.1):
                                                                                                                        for b30 in np.arange(0.0, 1.1,0.1):
                                                                                                                            b31 = 1 - np.sum([b1, b2, b3, b4, b5, b6, b7,b8, b9, b10, b11, b12,b13,b14,b15,b16, b17, b18, b19, b20, b21, b22,b23, b24, b25, b26, b27,b28,b29,b30])
                                                                                                                            if (b31 >= 0.0):
                                                                                                                                x = [b1, b2, b3, b4, b5, b6, b7,b8, b9, b10, b11, b12,b13,b14,b15,b16, b17, b18, b19, b20, b21, b22,b23, b24, b25, b26, b27,b28,b29,b30,b31]
                                                                                                                                if (np.sum(x) == 1.0) or (np.sum(x) == 1):
                                                                                                                                    config.append([x])
    config=np.asanyarray(config)
    config=np.squeeze(config)

返回配置

编辑:

按照@Martijn Pieters 的回答:

set_of_configurations=itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30)

我想通过说我只需要 2000 个配置来确定预算。

有没有办法做到以下几点:

    set_of_configurations=itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30,budget=2000)
   set_of_configurations = np.asarray(list(set_of_configurations))
   set_of_configurations.shape
   (2000,30)

因为有 30 个循环,我们得到了数百万个配置并且进程被终止。

我尝试了什么?

set_of_configurations_1=itertools.product(np.arange(0.0, 1.1, 0.1), repeat=15)
set_of_configurations_2=itertools.product(np.arange(0.0, 1.1, 0.1), repeat=15)
set_of_configurations=itertools.product(set_of_configurations_1,set_of_configurations_2)

但是我得到了 l 杀死进程

set_of_configurations=itertools.product(set_of_configurations_1,set_of_configurations_2)

有什么提示吗?

谢谢

【问题讨论】:

您可以改用itertools.product() 创建笛卡尔积; itertools.product(np.arrange(0.0, 1.1, 0.1), repeat=30)。但是,您为什么要这样做 非常感谢@MartijnPieters 的回答。是否可以添加预算?假设只需要 2000 个配置? @MartijnPieters,它们代表我数据的随机系数 @MartijnPieters,请看我的更新 【参考方案1】:

根据@Martjin Pieters 给出的指示,这是解决方案。一切都是关于使用 isslice :

set_of_configurations=itertools.islice(itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30),0,10000)

【讨论】:

鉴于您只取 10000 个项目,因此每个项目中只有最后 4 个条目可以是非零 - 前 26 个将始终为零。那是你要的吗? (另外,请注意,总和为 1.0 的配置将少于 300 个。) @MarkDickinson,好点子。那么我怎样才能从最后的 4 个条目中获取配置呢?

以上是关于itertools.product(np.arange(0.0, 1.1, 0.1), repeat=30) 杀死进程的主要内容,如果未能解决你的问题,请参考以下文章

itertools.product - 返回列表而不是元组

itertools.product 消除重复元素

Itertools.product 自定义每个输入的组合数量?

Python for 循环偏移 (Itertools.product)

itertools.product的Numpy等价物[重复]

为啥使用 itertools.product 时会出现 MemoryError?