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

2024-04-25 14:46:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想创建一个否则为0的矩阵,它在values中的元组给出的所有坐标处取值idx(第4行的矩阵元素,第25列是2),最终将其输入热图。做这件事最有助于Python的方法是什么?你知道吗

在嵌套循环中提取元组和idx似乎是在浪费SimpleNamespace类型。创建一个像dokèu矩阵这样的稀疏矩阵并不是很有利,因为这样你就必须转换成一个合适的矩阵来计算热图(?)你知道吗

编辑:我的尝试(这很麻烦,并且会抛出一个错误bc热图不会接受dok\ U矩阵)

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)

Tags: inimport元素forasrange矩阵matrix
1条回答
网友
1楼 · 发布于 2024-04-25 14:46:24

要从您给出的样本中生成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])

相关问题 更多 >