用Scipy即时更新COO矩阵



我在搜索站点后尚未找到解决此问题的解决方案。很简单,我想更新已经存在的COO稀疏矩阵。所以可以说我已经启动了一个COO矩阵:

from scipy.sparse import coo_matrix
import numpy as np
row  = np.array([0, 3, 1, 0])
col  = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
a=coo_matrix((data, (row, col)), shape=(4, 4)).toarray()
array([[4, 0, 9, 0],
      [0, 7, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 5]])

很好,但是如果我只想要一个空的稀疏阵列并仅使用形状启动,然后多次更新值。我成功的唯一方法是在我的旧矩阵中添加一个新的COO矩阵

a=coo_matrix((4, 4), dtype=np.int8)
a=a+coo_matrix((data, (row, col)), shape=(4, 4))
a.toarray()
array([[4, 0, 9, 0],
      [0, 7, 0, 0],
      [0, 0, 0, 0],
      [0, 0, 0, 5]])

我想多次更新此稀疏阵列。但这需要一段时间,因为我呼吁每个更新的COO功能。必须有一种更好的方法,但我觉得文档有点光线(至少我已经阅读的内容),或者我只是看不到它。

非常感谢

以这种方式制作COO矩阵时,它将您的输入数组用作矩阵的属性(前提是它们是正确的类型):

In [923]: row  = np.array([0, 3, 1, 0])
     ...: col  = np.array([0, 3, 1, 2])
     ...: data = np.array([4, 5, 7, 9])
     ...: A=sparse.coo_matrix((data, (row, col)), shape=(4, 4))
In [924]: A
Out[924]: 
<4x4 sparse matrix of type '<class 'numpy.int32'>'
    with 4 stored elements in COOrdinate format>
In [925]: A.row
Out[925]: array([0, 3, 1, 0])
In [926]: id(A.row)
Out[926]: 3071951160
In [927]: id(row)
Out[927]: 3071951160

类似于A.colA.data

对于显示和计算,矩阵可能会转换为csr格式,因为许多操作未针对coo格式定义。

毫无疑问,coo格式不会实现索引,无论是用于获取还是设置。

lil格式设计用于更轻松的增量更改。对csr的索引更改也是可能的,但会发出警告。

,但coo通常用于构建新矩阵。例如,在bmat格式中,组件矩阵的coo属性合并到新数组中,然后将其用于构造新的coo矩阵。

逐步构建coo的一种好方法是将新值与rowcoldata数组保持串联,然后定期从这些数组中构建一个新的coo

更新dok格式:如何在Python上逐步创建稀疏矩阵?

将列放入空稀疏矩阵

使用python发电机有效地创建scipy.lil_matrix

我首先认为coo_matrix是不可变的,因为它不支持任何索引,也不支持索引分配。事实证明,您可以直接突变空的稀疏矩阵的基础结构:

from scipy.sparse import coo_matrix
import numpy as np
row  = np.array([0, 3, 1, 0])
col  = np.array([0, 3, 1, 2])
data = np.array([4, 5, 7, 9])
a = coo_matrix((4, 4), dtype=np.int8)
print(a.toarray())
a.row = row
a.col = col
a.data = data
print(a.toarray())

话虽如此,可能还有其他稀疏格式更适合这种方法。

最新更新