2016-09-13 60 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