scipy 稀疏矩阵在 numpy 矩阵子类上建模,因此将 * 实现为矩阵乘法 . a.multiply 是逐个元素的多元化,例如 np.array * 使用的元素 .
我建议制作几个小矩阵,并尝试各种形式的乘法,包括你认为的等效的 np.dot . 用一些小东西来判断发生了什么会更容易 .
a = np.arange(12).reshape(3,4)
a1 = sparse.csr_matrix(a)
np.dot(a, a.T)
a1 * a.T
a*a
a1.multiply(a1)
etc
仅供参考,这是你想要的(使用密集阵列):
In [7]: a=np.arange(12).reshape(3,4)
In [8]: [np.dot(a[i],a[i]) for i in range(3)]
Out[8]: [14, 126, 366]
In [9]: np.einsum('ij,ij->i',a,a)
Out[9]: array([ 14, 126, 366])
和稀疏的
In [11]: a1=sparse.csr_matrix(a)
完整的矩阵或点积更符合您的要求,对吧?你只想要对角线 .
In [15]: (a1*a1.T).A
Out[15]:
array([[ 14, 38, 62],
[ 38, 126, 214],
[ 62, 214, 366]], dtype=int32)
In [16]: a.dot(a.T)
Out[16]:
array([[ 14, 38, 62],
[ 38, 126, 214],
[ 62, 214, 366]])
In [21]: (a1*a1.T).diagonal()
Out[21]: array([ 14, 126, 366], dtype=int32)
对于非常稀疏的东西,采用完全矩阵乘法后跟对角线可能与任何替代方案一样快 . 迭代稀疏矩阵的行是相对慢的操作,而矩阵乘法已经在快速c代码中实现 .
另一种方法 - 元素乘法后跟sum .
In [22]: np.sum(a*a,axis=1)
Out[22]: array([ 14, 126, 366])
In [23]: a1.multiply(a1).sum(axis=1)
Out[23]:
matrix([[ 14],
[126],
[366]], dtype=int32)
稀疏实现 sum 作为矩阵乘法(由一列1) .
In [26]: a1.multiply(a1)*np.array([1,1,1,1])[:,None]
Out[26]:
array([[ 14],
[126],
[366]], dtype=int32)