【发布时间】:2020-12-07 19:53:47
【问题描述】:
我想实现以下操作:
B = diag(u) @ K @ diag(v) - 一些矩阵 K 从左到右乘以对角矩阵。显式创建密集矩阵和 2 个矩阵矩阵乘积非常昂贵。如果K 是np.ndarray,我想出了以下解决方案:
u[:, None] * K * v[None, :]
效果很好,因为广播发生了,但是如果 K 是 scipy.sparse.csr_matrix 我会遇到尺寸不匹配的问题:
ValueError: dimension mismatch
我试过了
u[:, None] * K.multiply(v[None, :])
计算了左操作数,但乘法也失败了。应该如何对稀疏矩阵实现相同的操作?
编辑
我对较小的数据进行了测试,在这种情况下没有这样的错误,但np.ndarray 和csr_matrix 的结果不同:
import numpy as np
from scipy.sparse import csr_matrix
A = np.random.randint(low = 0, high = 10, size = (5, 5))
A_sp = csr_matrix(A)
x = np.random.randint(low = 1, high = 6, size = 5)
y = np.random.randint(low = 1, high = 6, size = 5)
x[None, :] * A * y[:, None]
# output
array([[ 72, 48, 128, 60, 48],
[ 45, 20, 140, 175, 60],
[ 18, 24, 32, 15, 28],
[ 42, 24, 0, 70, 16],
[ 30, 40, 32, 60, 0]])
x[None, :] * A_sp * y[:, None]
# output
array([[436, 288, 400, 432, 236],
[545, 360, 500, 540, 295],
[109, 72, 100, 108, 59],
[218, 144, 200, 216, 118],
[218, 144, 200, 216, 118]])
【问题讨论】:
-
minimal reproducible example 请。我不喜欢根据冗长的描述制作测试数组
-
@hpaulj 感谢您的建议,已编辑
-
x[None,:]*A_sp是矩阵乘法,与@相同。结果是 (1,5)ndarray。下一个*y[:,None]是外播产品。 -
@hpaulj 你是对的,请你告诉
scipy中应该做什么,以便通过对角矩阵从左侧和右侧进行复制?