[英]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.