我需要在没有像numpy数组这样的外部库的帮助下生成这个 我在5 * 5矩阵上有N = 5的大小,并且元素的原始列表可以说:
elements = [1,2,3]
我想生成此网格的所有可能排列(5 * 5):
例如N = 5
[[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[2,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[3,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[1,2,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[2,2,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[3,2,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
[[1,3,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
]
...
[[2,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
]
[[3,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
[3,3,3,3,3],
]
如果尽可能最有效,我可以生成这个。
已经在网格上尝试itertools.permutations
我改为N = 5,因为元素的数量少于适合行的数量,这样就更难了。
答案 0 :(得分:1)
在Python中,这种类型的迭代器称为product:
from itertools import product
N=2
elements = [1,2,3]
B=product(elements,repeat=N)
for c in product(B,repeat=N):
print c
打印
((1, 1), (1, 1))
((1, 1), (1, 2))
((1, 1), (1, 3))
((1, 1), (2, 1))
((1, 1), (2, 2))
((1, 1), (2, 3))
((1, 1), (3, 1))
((1, 1), (3, 2))
...
((3, 3), (3, 1))
((3, 3), (3, 2))
((3, 3), (3, 3))
第一个产品生成B:迭代器,用于由元素构成的单个行的所有选择。 然后第二个产品在由B中的行构成的矩阵的所有选项上产生一个迭代器。
答案 1 :(得分:1)
您也可以使用itertools.combinations_with_replacement()。
示例:强>
import itertools
def get_matrices( elements, N ):
rows = itertools.combinations_with_replacement( elements, N )
result = itertools.combinations_with_replacement( rows, N )
return list(result)
matrices = get_matrices( [1,2], 2 )
for matrix in matrices:
print matrix
<强>输出:强>
((1, 1), (1, 1))
((1, 1), (1, 2))
((1, 1), (2, 2))
((1, 2), (1, 2))
((1, 2), (2, 2))
((2, 2), (2, 2))
答案 2 :(得分:1)
你可以这样做: 将N×N矩阵解释为集合{1,2,... M}中的N²个元素的单个列表。
现在,您可以将此列表解释为基数M(将M解释为0)
e.g. (N=3, M=3)
1 2 2
3 1 2
2 1 1
是列表122312211是号码122012211(基数3)
所以你可以简单地从0 to (M^N²) -1
算起来生成所有可能的N²数字(基数为M)
e.g. N=3 M=3
0000000000
0000000001
0000000002
0000000010
0000000011
0000000012
0000000020
...
2222222221
2222222222
这个数字中的每一个都可以写成3×3矩阵。 e.g。
210211001是矩阵(3 == 0 so)
2 1 3
2 1 1
3 3 1
通过这种方式,您可以获得所有可能的N x N网格,其中包含{1,2 .. M}
中的元素