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

Python 如何从SimpleNamespace对象构建(稀疏)矩阵?,python,scipy,namespaces,sparse-matrix,heatmap,Python,Scipy,Namespaces,Sparse Matrix,Heatmap,我有一个SimpleNamespace对象列表。P的第三个元素可能如下所示: namespace(idx=2, values=[(0, 6), (4, 25), (7, 40), (11, 44), (13, 46), (20, 53)]) 我想创建一个否则为-0的矩阵,它在values中元组给出的所有坐标处获取valueidx(第4行第25列的aka矩阵元素为2),最终将其输入热图。做这件事的最蟒蛇式的方法是什么 在嵌套循环中提取元组和idx似乎是对SimpleNamespace类型的浪费。

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

namespace(idx=2, values=[(0, 6), (4, 25), (7, 40), (11, 44), (13, 46), (20, 53)])
我想创建一个否则为-0的矩阵,它在
values
中元组给出的所有坐标处获取value
idx
(第4行第25列的aka矩阵元素为2),最终将其输入热图。做这件事的最蟒蛇式的方法是什么

在嵌套循环中提取元组和idx似乎是对SimpleNamespace类型的浪费。创建一个像dok_矩阵这样的稀疏矩阵并没有什么好处,因为这样你就必须转换成一个适合热图的矩阵(?)

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


要根据您提供的样本制作
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])
[104]中的
:M=sparse.coo_矩阵((数据,(行,列)))
In[105]:M
出[105]:
在[106]中:文学硕士
出[106]:
数组([[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]:数组([2,2,2,2,2,2])

SimpleNameSpace和
热图的特别之处是什么
scipy.sparse
已尝试尽可能简化其不同格式之间的转换。首先,我将重点收集
coo_matrix
接受的数组类型-您的
idx
进入
data
属性(通过复制),坐标将在
cols
属性之间分割。
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])