对角矩阵,我有两个列表:灌装基于选择
[(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)' –