用scipy动态更新coo矩阵

时间:2016-11-27 22:04:47

标签: python arrays numpy scipy sparse-matrix

搜索网站后,我找不到解决此问题的方法。它很简单,我想更新一个已经存在的co稀疏矩阵。所以我想说我已经启动了一个库矩阵:

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]])

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

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函数。必须有一个更好的方法,但我觉得文档有点轻(至少我读过)或我只是没有看到它。

非常感谢

2 个答案:

答案 0 :(得分:5)

当你用这种方式制作一个铜矩阵时,它会使用输入数组作为矩阵的属性(前提是它们是正确的类型):

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格式旨在简化增量更改。 <{1}}的索引更改也是可能的,但它会发出警告。

csr通常用于构建新矩阵。例如,在coo格式中,组件矩阵的bmat属性被组合成新数组,然后用于构造新的coo矩阵。

逐步构建coo的一种好方法是将新值连接到coorowcol数组,然后定期构建一个新{ {1}}来自那些。

更新data格式时: How to incrementally create an sparse matrix on python?

putting column into empty sparse matrix

creating a scipy.lil_matrix using a python generator efficiently

答案 1 :(得分:3)

我首先认为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()) 是不可变的,因为它不支持任何索引,也不支持索引。事实证明,你可以直接改变空稀疏矩阵的底层结构:

var p1 = document.getElementById('p1');

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