2016-04-25 182 views
1

我有以下問題。我想創建一個尺寸爲2^L x L + 2的numpy矩陣。第一列是變量,我在後面的程序中定義。在最後的L列應該是所有可能性來分配零和一(在我看來,二進制計數可能是一個選項,請參閱示例)。第二列是一個數字。我需要這個列來爲第二列排序矩陣。二進制矩陣條目

[[ x1, 0, 0, 0, 0] 
[ x2, 1, 0, 0, 1] 
[ x3, 1, 0, 1, 0] 
[ x4, 2, 0, 1, 1] 
[ x5, 1, 1, 0, 0] 
[ x6, 2, 1, 0, 1] 
[ x7, 2, 1, 1, 0] 
[ x8, 3, 1, 1, 1]] 
+0

爲什麼你需要numpy(矩陣)? – JulienD

+0

我認爲這不是真的必要,因爲我可以將矩陣轉換爲一個numpy矩陣。 (我想稍後使用張量點) – HighwayJohn

回答

1

什麼你問的似乎不太可能成爲你真正需要的東西,以解決你遇到的任何問題。這就是說,這是很容易通過採取numpy的廣播能力的優勢,產生的RHS:

>>> L = 3 
>>> m = (np.arange(2**L)[:,None] >> np.arange(L)[::-1]) & 1 
>>> m 
array([[0, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 1], 
     [1, 0, 0], 
     [1, 0, 1], 
     [1, 1, 0], 
     [1, 1, 1]], dtype=int32) 
>>> np.hstack([m.sum(1,keepdims=True), m]) 
array([[0, 0, 0, 0], 
     [1, 0, 0, 1], 
     [1, 0, 1, 0], 
     [2, 0, 1, 1], 
     [1, 1, 0, 0], 
     [2, 1, 0, 1], 
     [2, 1, 1, 0], 
     [3, 1, 1, 1]], dtype=int32) 

可以以類似的方式將您的數據的列。

+0

你可能是對的,但說,你的解決方案解決了我的問題!謝謝:) – HighwayJohn

+0

在某些系統上,我遇到了「keepdims」問題。在我使用pycharm的mac上,該程序完美無瑕,但在linux上該程序並未啓動。你知道什麼可能是錯的嗎? (TypeError:'keep dims'是這個函數的無效關鍵字參數) – HighwayJohn

+0

@HighwayJohn:在不工作的系統上,你有一個過時的numpy版本。 – DSM

1

這會給你一個你所描述內容的元組列表。你當然可以改爲列表/數組/矩陣/任何。

import itertools 
L = [] 
k = 3 
combs = itertools.combinations_with_replacement([0,1], k) 
perms = [y for c in combs for y in set(itertools.permutations(c))] 
for c in perms: 
    L.append(('myvar',sum(c)) + c) 

輸出:

In [42]: L 
Out[42]: 
[('myvar', 0, 0, 0, 0), 
('myvar', 1, 1, 0, 0), 
('myvar', 1, 0, 1, 0), 
('myvar', 1, 0, 0, 1), 
('myvar', 2, 0, 1, 1), 
('myvar', 2, 1, 1, 0), 
('myvar', 2, 1, 0, 1), 
('myvar', 3, 1, 1, 1)] 

排序WRT到 「列」(在本例中第1欄),你可以使用

import operator 
sorted(L, key=operator.itemgetter(1)) 
+0

此解決方案不會創建所有可能性,或者我錯了嗎?這是我的問題中的重要一點。 – HighwayJohn

+0

如果你正在使用itertools路由,我想你會想'product([0,1],repeat = k)'而不是'c_w_r'。 – DSM

+0

對,它錯過了排列。我編輯,以使其正確。或者產品的確如此。 – JulienD