基于选择器

时间:2016-09-13 21:21:08

标签: python python-3.x

我有两个清单:

[(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 

3 个答案:

答案 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