繁体   English   中英

在这种情况下,itertools可以用于数量不确定的尺寸吗?

[英]Can itertools be used for an unspecified number of dimensions in this case?

这是我的代码,使用dim = 3,但是我希望它适用于任何维度,而无需手动编辑代码。

我希望能够最终在3到20之间更改尺寸,而无需手动添加for循环。 我一直在查看itertools,但不知道如何从itertools.product()创建的元组中选择正确的值以平方并为if语句itertools.product()

arrayshape = (width * 2 + 1,) * dim
funcspace = np.zeros(shape=arrayshape, dtype='b')

x1 = list(range(-int(width), int(width + 1)))
x2 = x1
x3 = x1

for i in range(len(x1)):
    for j in range(len(x2)):
        for k in range(len(x3)):
            if round(np.sqrt(x1[i] ** 2 + x2[j] ** 2 + x3[k] ** 2)) in ranges:
                funcspace[i][j][k] = 1

您可以对向量enumerate使用product ,这将产生值和索引:

for ((i,v1),(j,v2),(k,v3)) in itertools.product(enumerate(x1),enumerate(x2),enumerate(x3)):
    if round(np.sqrt(v1**2+v2**2+v3**2)) in ranges:
            funcspace[i][j][k]=1

作为奖励,您摆脱了unpythonic range(len())构造。

当您拥有向量载体时,我已经做了一个更一般的案例。 读起来有点困难,因为在for循环中没有完成拆包。

平方和使用做sum在1个指数(值),如果条件匹配,我们循环,直到我们找到了“更深层次”列表中的值设置为1

for t in itertools.product(*(enumerate(x) for x in x_list)):
    # compute the squared sum of values
    sqsum = sum(v[1]**2 for v in t)
    if round(sqsum) in ranges:
        # traverse the dimensions except the last one
        deeper_list = funcspace
        for i in range(len(t)-1):
            deeper_list = deeper_list[t[i][0]]
        # set the flag using the last dimension list
        deeper_list[t[-1][0]] = 1

如注释中所述,由于x1似乎重复出现,因此您可以将第一条语句替换为:

for t in itertools.product(enumerate(x1), repeat=dim):

另一条评论指出,由于funcspace是一个numpy ndarray ,我们可以通过传递索引列表来简化“设置为1”循环:

funcspace[[x[0] for x in t]] = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM