2015-12-24 20 views
0

我需要生成這個沒有像numpy數組的外部庫的任何幫助。
我有大小N = 5對5×5矩陣,和元素的原料列表可以說:所有可能的矩陣(列表清單)只包含來自原始列表元素的元素python

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

你能再次檢查? 它不重複,因爲它會生成一個列表的所有排列。 我需要生成所有可能的列表,然後可能是產品。它更難的問題。 – Tal

+0

我想你也不會被允許使用'itertools.permutation'? –

+0

這還不夠。你只能用'itertools.permutation'來做。我已經查過了。它更難的問題。 – Tal

回答

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中所有行的矩陣的迭代器。

+0

我嘗試和這個代碼是給所有可能的矩陣。謝謝! – Tal

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 

輸出: 解釋你的N×N矩陣作爲N²元素的單一列表出來的一套:

((1, 1), (1, 1)) 
((1, 1), (1, 2)) 
((1, 1), (2, 2)) 
((1, 2), (1, 2)) 
((1, 2), (2, 2)) 
((2, 2), (2, 2)) 
1

你可以這樣做{1,2,... 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矩陣。 例如

210211001是矩陣(3 == 0左右)

2 1 3 
2 1 1 
3 3 1 

這樣,你得到所有可能的N×N的網格與元素{1,2 ..中號}

+0

你能寫出高效的python代碼嗎? – Tal

+0

您只需將數字除以M,剩下的就是數字基數M的最後一位,即可得到基本M數字的數字。直到您的數字爲0,並且在基數M上有孔表示。應該很容易用任何語言。 – MrSmith42

相關問題