调整稀疏矩阵时出现意外行为

时间:2017-06-20 09:21:54

标签: python scipy sparse-matrix

我有一个稀疏矩阵a和一个数组M的位置,我希望将a增加一个。此数组n可能包含重复项,每当a中元素为​​n次时,我想将M添加到from scipy import sparse as sp M = sp.csr_matrix((3, 4), dtype=float) M[[0,0,0,0,0], [0,1,0,1,0]] += 1 中的相应位置。我通过以下方式做到了这一点:

M[0,0]

但是当我运行它时,ActiveWorkbook.Sheets(previousSheet)只增加一个,是否有一种简单的方法可以适应它?

1 个答案:

答案 0 :(得分:0)

MATLAB如何处理这个问题?

numpy有一个特殊的函数来处理这个重复的索引案例add.at

Using ufunc.at on matrix

scipy.sparse尚未实施。

由于sparse在从coo格式转换为csr格式时对重复坐标求和,我怀疑这个问题可能会以利用它的方式进行转换。事实上csr矩阵有一个M.sum_duplicates方法。

我必须四处寻找细节。

In [876]: M = sparse.csr_matrix((3, 4), dtype=float)
In [877]: M
Out[877]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in Compressed Sparse Row format>

演示np.add.at操作:

In [878]: arr = M.A
In [879]: arr[[0,0,0,0,0],[0,1,0,1,0]] += 1
In [880]: arr
Out[880]: 
array([[ 1.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

In [883]: arr = M.A
In [884]: np.add.at(arr,[[0,0,0,0,0],[0,1,0,1,0]],1)
In [885]: arr
Out[885]: 
array([[ 3.,  2.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

添加到M会产生相同的缓冲操作 - 并带有警告。改变矩阵的稀疏性是相对昂贵的。

In [886]: M[[0,0,0,0,0],[0,1,0,1,0]] += 1
....
  SparseEfficiencyWarning)
In [887]: M
Out[887]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>'
    with 2 stored elements in Compressed Sparse Row format>
In [888]: M.A
Out[888]: 
array([[ 1.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

执行此添加的正确方法是使用需要添加的值创建新的稀疏矩阵。我们可以利用coo样式输入和重复的转换为csr的事实:

In [895]: m = sparse.csr_matrix((np.ones(5,int),([0,0,0,0,0],[0,1,0,1,0])), shape=M.shape)
In [896]: m
Out[896]: 
<3x4 sparse matrix of type '<class 'numpy.int32'>'
    with 2 stored elements in Compressed Sparse Row format>
In [897]: m.A
Out[897]: 
array([[3, 2, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]], dtype=int32)

现在我们可以添加原始和新的:

In [898]: M = sparse.csr_matrix((3, 4), dtype=float)
In [899]: M+m
Out[899]: 
<3x4 sparse matrix of type '<class 'numpy.float64'>'
    with 2 stored elements in Compressed Sparse Row format>