java稀疏矩阵_点积稀疏矩阵

这篇博客探讨了Scipy的稀疏矩阵与NumPy矩阵之间的不同操作,包括乘法、点积和元素乘法。通过实例展示了矩阵乘法(*)在稀疏矩阵中如何实现矩阵乘法,而a.multiply(a)执行的是元素乘法。还提到了计算对角线元素的几种方法,如直接取对角线、使用einsum和矩阵乘法后的对角线提取。对于非常稀疏的矩阵,完全矩阵乘法可能与仅提取对角线一样有效率。此外,文章还比较了密集矩阵和稀疏矩阵的乘法性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值