對角矩陣,我有兩個列表:灌裝基於選擇
[(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, 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
這其實是很容易的,如果你使用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
這裏)和保留了與具有對應的選擇數據真正的價值。
列表理解然後創建矩陣並相應地填充零或零。
我建議使用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其他稀疏矩陣格式(包括對角線)。
謝謝。你的回答很好。但我必須將原始矩陣轉換爲對稱矩陣。但不知何故: 'm_symm = m + m.T' 將無法正常工作。 –
這是因爲'm.T'不存在,請改用'm.transpose()'。要查找有關如何使用稀疏矩陣的更多信息,請參見[官方文檔](http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix) – jadsq
這是否必須實際上是一個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
感謝您的答案和編輯我的問題!我添加了一個額外的行來將列表恢復爲矩陣: 'np.array(res)' –