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 自定义每个输入的组合数量?
Python for 循环偏移 (Itertools.product)