我拥有的:,我有列表List123=[-13,3,12,1]和2乘4-矩阵Matrix123=numpy.zeros((2,4), dtype=Decimal).
我想要的:,我想将矩阵的所有条目更改为列表中的任何条目,然后打印到终端。有4^(2*4)=65536种可能的组合。我想打印每一个密码。
我现在是怎么做的:这里是我的当前代码:
List123=[-13,3,12,1]
Matrix123=numpy.zeros((2,4), dtype=Decimal)
k=0
for k in List123:
Matrix123[0,0]=k
for k in List123:
Matrix123[0,1]=k
for k in List123:
Matrix123[0,2]=k
for k in List123:
Matrix123[0,3]=k
for k in List123:
Matrix123[1,0]=k
for k in List123:
Matrix123[1,1]=k
for k in List123:
Matrix123[1,2]=k
for k in List123:
Matrix123[1,3]=k
print Matrix123
print " "我的问题是:,用几行代码编写这篇文章的更紧凑的方法是什么?我也需要为一个23乘27矩阵做同样的事。这意味着,如果我找不到更紧凑的方法,就必须手动编写23*27=621 for -循环的代码。
发布于 2017-09-12 14:30:53
您可以使用itertools.product
import itertools
list123 = [-13, 3, 12, 1]
for matrix in itertools.product(list123, repeat=8):
print matrix它将用-13, 3, 12 and 1输出长度为8的所有可能的解。matrix将是一个包含8个数字的元组,是可能的解决方案。
如果您需要它在实际的numpy.matrix表单中输出结果,您可以动态创建它们(尽管这需要更多的时间)。
import numpy as np
for prod in itertools.product(list123, repeat=8):
print np.matrix([prod[:4], prod[4:]])或者使用reshape来提高可读性(感谢@MenglongLi)
for prod in itertools.product(list123, repeat=8):
print np.reshape(prod, (2, 4))它将给你65536预期的结果。
发布于 2017-09-12 14:26:54
我强烈建议您在python内置工具中使用迭代工具:
from itertools import product
import numpy as np
List123 = [-13, 3, 12, 1]
for i in product(List123, repeat=8):
print(np.array(i).reshape(2, 4))下面是一个纯递归函数版本:
import numpy as np
List123 = [-13, 3, 12, 1]
def dfs(depth=1, result=None):
if result is None:
result = []
if depth == 9:
print(np.array(result).reshape(2, 4))
return
for i in List123:
dfs(depth + 1, result + [i])
dfs()无论是哪种方式,你都有65536的结果。
发布于 2017-09-12 15:28:55
使用np.meshgrid
def my_product(list, shape = (4,2)):
r = np.product(shape)
out = np.stack(np.meshgrid(*(List123,) * r))
out = out.reshape(shape[::-1] + (-1,)).T
for mat in list(out):
print(mat)当然,如果你的shape是(23,27),这将导致一个memerror,即使len(list) = 2 --所有这些排列都会填满地球上所有的存储空间--数量多得可笑,并且打印它们都需要花费很长时间,直到宇宙的热死。
https://stackoverflow.com/questions/46178845
复制相似问题