我有一个稀疏矩阵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)
只增加一个,是否有一种简单的方法可以适应它?
答案 0 :(得分:0)
MATLAB如何处理这个问题?
numpy
有一个特殊的函数来处理这个重复的索引案例add.at
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>