我拥有的内容:我有列表List123=[-13,3,12,1]
和2 x 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-by-27做同样的事情矩阵。这意味着如果我找不到更紧凑的方法,我必须手动编写23 * 27 = 621 for循环的代码。
答案 0 :(得分:3)
我强烈建议您在python内置工具中使用itertools:
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个结果。
答案 1 :(得分:3)
使用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
,因为所有这些排列都会填充地球上所有存储空间的荒谬数字时间结束,并将它们打印出来,直到宇宙的热量消失。
答案 2 :(得分:0)
您可以使用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个结果。