2016-09-13 81 views
0

對角矩陣,我有兩個列表:灌裝基於選擇

[(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] 

[False, False, True, False, False, False] 

第一個列表代表ROW_NUMBER,矩陣的COLUMN_NUMBER欄。第二個列表表示元素值。如何建立一個有效的循環(或其它算法),所以我結束了一個4×4矩陣:

0 0 0 0 
0 0 0 0 
0 1 0 0 
0 0 0 0 

回答

1

這其實是很容易的,如果你使用itertools.compress

from itertools import compress 

d = [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] 
sel = [False, False, True, False, False, False] 

res = [[0 if (j, i) not in compress(d, sel) else 1 for i in range(4)] for j in range(4)] 

產量:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]] 

壓縮需要一些數據(d這裏)和某些選擇器(sel這裏)和保留了與具有對應的選擇數據真正的價值。

列表理解然後創建矩陣並相應地填充零或零。

+0

感謝您的答案和編輯我的問題!我添加了一個額外的行來將列表恢復爲矩陣: 'np.array(res)' –

1

我建議使用scipy模塊中的sparse庫來進行高效的稀疏矩陣操作。這裏是你將如何創建所需的矩陣:

from scipy import sparse 
coo = [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] 
data = [False, False, True, False, False, False] 

m = sparse.coo_matrix((data,zip(*coo)), shape=(4,4)) 
print(m) 

注意,有這取決於你的表示覺得最合適的創建和操縱它many其他稀疏矩陣格式(包括對角線)。

+0

謝謝。你的回答很好。但我必須將原始矩陣轉換爲對稱矩陣。但不知何故: 'm_symm = m + m.T' 將無法​​正常工作。 –

+0

這是因爲'm.T'不存在,請改用'm.transpose()'。要查找有關如何使用稀疏矩陣的更多信息,請參見[官方文檔](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix) – jadsq

0

這是否必須實際上是一個numpy樣矩陣?在我看來,你可以做這樣的事情:

coords = [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] 
values = [False, False, True, False, False, False] 

DEFAULT_VALUE = 0 

height, width = max(coords)[0], max(coords, key=lambda x_y:x_y[1])[1] 
matrix = [[DEFAULT_VALUE for _ in range(width)] for _ in range(height)] 
for coord, value in zip(coords, values): 
    y, x = coord 
    matrix[y][x] = value