我有两个清单:
[(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
答案 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
)并保留具有相应选择器且具有真值的数据。
列表推导然后创建矩阵并相应地用零或一个填充它。
答案 1 :(得分:1)
我建议使用sparse
模块中的scipy
库进行有效的稀疏矩阵操作。以下是创建所需矩阵的方法:
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个其他稀疏矩阵格式(包括对角线),具体取决于您认为最适合创建和操作它的表示形式。
答案 2 :(得分: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