Python SciPy稀疏矩阵;。乘;没有返回预期结果?

Python SciPy稀疏矩阵;。乘;没有返回预期结果?,python,scipy,sparse-matrix,Python,Scipy,Sparse Matrix,因此,我使用scipy.sparse创建了一个COO矩阵“COO_mat”,前三个非零元素为: coo_mat.data[:5] >>> array([0.61992174, 1.30911574, 1.48995508]) 我希望将矩阵乘以2,我明白我可以简单地做到: (coo_mat*2).data[:5] >>> array([1.23984347, 2.61823147, 2.97991015]) 但是,我不明白为什么我尝试时结果不一致: coo_

因此,我使用scipy.sparse创建了一个COO矩阵“COO_mat”,前三个非零元素为:

coo_mat.data[:5]
>>> array([0.61992174, 1.30911574, 1.48995508])
我希望将矩阵乘以2,我明白我可以简单地做到:

(coo_mat*2).data[:5]
>>> array([1.23984347, 2.61823147, 2.97991015])
但是,我不明白为什么我尝试时结果不一致:

coo_mat.multiply(2).data[:5]
>>> array([2.04156392, 1.54042948, 2.3306947 ])

我在其他分析中使用了元素乘法方法,它的工作原理与我预期的一样。使用
sparse.coo\u matrix.multiply()

SciPy不能保证大多数稀疏矩阵操作的输出格式。它可以对COO矩阵的元素进行重新排序,甚至可以将格式转换为CSR或CSC或其他格式。这里,
coo_mat.multiply(2)
返回一个CSR矩阵,该矩阵具有完全不同的元素表示和元素布局:

In [11]: x = scipy.sparse.coo_matrix([[1]])

In [12]: type(x.multiply(2))
Out[12]: scipy.sparse.csr.csr_matrix
scipy.sparse.coo_matrix
它的
multiply
方法来自
scipy.sparse.spmatrix
基类,它实现了

def multiply(self, other):
    """Point-wise multiplication by another matrix
    """
    return self.tocsr().multiply(other)

在该方法中没有对COO进行优化。

SciPy不承诺任何关于大多数稀疏矩阵运算的输出格式的内容。它可以对COO矩阵的元素进行重新排序,甚至可以将格式转换为CSR或CSC或其他格式。这里,
coo_mat.multiply(2)
返回一个CSR矩阵,该矩阵具有完全不同的元素表示和元素布局:

In [11]: x = scipy.sparse.coo_matrix([[1]])

In [12]: type(x.multiply(2))
Out[12]: scipy.sparse.csr.csr_matrix
scipy.sparse.coo_matrix
它的
multiply
方法来自
scipy.sparse.spmatrix
基类,它实现了

def multiply(self, other):
    """Point-wise multiplication by another matrix
    """
    return self.tocsr().multiply(other)

在该方法中没有对COO进行优化。

好的,但是当我使用
.tocoo()
sparse.COO_matrix()
将CSR矩阵转换回COO并检查前3个元素时,我没有得到预期值。我知道不同的稀疏矩阵是如何组织和存储非零元素的,但密集矩阵应该是一致的。@bz13531:请看
toarray
输出,而不是
数据
。谢谢。似乎
中非零元素的顺序是在转换为CSR后重新使用的。我通过在
.multiply()
前后检查COO矩阵的
.row
.col
来确认这一点。COO中的非零可以是任意顺序。在CSR中,它们总是按行排序,通常也按行内的列排序。看看
.has_canonical_format
属性。好的,但是当我使用
.tocoo()
sparse.COO_matrix()
将CSR矩阵转换回COO并检查前3个元素时,我没有得到预期的值。我知道不同的稀疏矩阵是如何组织和存储非零元素的,但密集矩阵应该是一致的。@bz13531:请看
toarray
输出,而不是
数据
。谢谢。似乎
中非零元素的顺序是在转换为CSR后重新使用的。我通过在
.multiply()
前后检查COO矩阵的
.row
.col
来确认这一点。COO中的非零可以是任意顺序。在CSR中,它们总是按行排序,通常也按行内的列排序。查看
。has_canonical_format
属性。