如何从 SimpleNamespace 对象构建(稀疏)矩阵?

How to build a (sparse) matrix from SimpleNamespace objects?

我有一个 SimpleNamespace 对象的列表 P。 P 的第三个元素可能如下所示:

namespace(idx=2, values=[(0, 6), (4, 25), (7, 40), (11, 44), (13, 46), (20, 53)])

我想创建一个 otherwise-0 矩阵,它在 values 中的元组给出的所有坐标处取值 idx(也就是第 4 行第 25 列的矩阵元素为 2)最终将其输入热图中。最 pythonic 的方法是什么?

在嵌套循环中提取元组和 idx 似乎是对 SimpleNamespace 类型的浪费。创建一个像 dok_matrix 这样的稀疏矩阵无论如何都不是那么有利,因为你必须转换为热图的适当矩阵 (?)

编辑: 我的尝试(这很麻烦并且会抛出错误 bc heatmap won't take dok_matrix)

from scipy.sparse import dok_matrix
import seaborn as sns

#P is a list of namespaces as shown above   
S = dok_matrix((10000, 10000), dtype=np.int32)
for i in range(len(P)):
    no_tuples = len(P[i].values)
    for j in range(no_tuples):
        S[P[i].values[j][0], P[i].values[j][1]] = P[i].idx
sns.heatmap(S)

要根据您提供的样本制作 coo 矩阵:

In [95]: from scipy import sparse

In [96]: idx = 2; values=[(0, 6), (4, 25), (7, 40), (11, 44), (13, 46), (20, 53)]

In [97]: data,row,col = [],[],[]

In [98]: row1,col1 = list(zip(*values))    
In [99]: row1
Out[99]: (0, 4, 7, 11, 13, 20)

In [101]: data.extend([idx for _ in range(len(row1))]) 
# or [idx]*len(row1)   
In [102]: row.extend(row1)    
In [103]: col.extend(col1)

对所有命名空间重复此操作。

In [104]: M = sparse.coo_matrix((data, (row, col)))
In [105]: M
Out[105]: 
<21x54 sparse matrix of type '<class 'numpy.int64'>'
    with 6 stored elements in COOrdinate format>

In [106]: M.A
Out[106]: 
array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 2]])

In [107]: M.data
Out[107]: array([2, 2, 2, 2, 2, 2])