Python 基于选择器填充对角矩阵

Python 基于选择器填充对角矩阵,python,python-3.x,Python,Python 3.x,我有两份清单: [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] [False, False, True, False, False, False] 第一个列表表示矩阵的行号、列号。第二个列表表示元素值。如何创建一个有效的循环(或其他算法),以得到一个4乘4矩阵: 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 如果您使用: 收益率: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0

我有两份清单:

[(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)]

[False, False, True, False, False, False]
第一个列表表示矩阵的行号、列号。第二个列表表示元素值。如何创建一个有效的循环(或其他算法),以得到一个4乘4矩阵:

0 0 0 0
0 0 0 0
0 1 0 0
0 0 0 0 

如果您使用:

收益率:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
Compress获取一些数据(
d
此处)和一些选择器(
sel
此处),并保留具有真实值的相应选择器的数据


列表理解然后创建矩阵,并相应地用0或1填充它。

如果您使用:

收益率:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]
Compress获取一些数据(
d
此处)和一些选择器(
sel
此处),并保留具有真实值的相应选择器的数据


然后,列表理解创建矩阵,并相应地用0或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)

请注意,还有其他稀疏矩阵格式(包括对角线格式),具体取决于您认为最适合创建和操作它的表示形式。

我建议使用
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)

请注意,还有其他稀疏矩阵格式(包括对角线格式),这取决于您认为最适合创建和操作它的表示形式。

这实际上必须是一个类似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

这真的一定要像《黑客帝国》一样吗?在我看来,你可以这样做:

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)
感谢您的回答和编辑我的问题!我添加了一个额外的行以将列表返回矩阵:
np.array(res)
谢谢。你的答案很好。但我必须把原始矩阵变成对称矩阵。但不知何故,`m_symm=m+m.T'不起作用。这是因为
m.T
不存在,请使用
m.transpose()
。要了解有关如何使用稀疏矩阵的更多信息,请参阅“谢谢”。你的答案很好。但我必须把原始矩阵变成对称矩阵。但不知何故,`m_symm=m+m.T'不起作用。这是因为
m.T
不存在,请使用
m.transpose()
。有关如何使用稀疏矩阵的更多信息,请参见