【发布时间】:2017-10-29 20:21:55
【问题描述】:
假设我们有两个矩阵 a = [[1, 2][3, 4]], b = [[5, 6][7, 8]](在我的例子中它们非常大)。使用 numpy.dot(a,b),我们可以得到 res = [[19, 22],[43, 50]] 的结果。如果在结果中,我们只需要部分元素,即 [[19,NA],[NA,50]],我们不关心 22 或 43。我如何在知道哪个元素的情况下实现这样的 numpy 点积我想要的结果矩阵的一部分(在我的例子中是 mask = [[1, 0][0, 1]])?
实际结果掩码是一个随机的 csr_matrix。
一般来说,我们有两个大矩阵 A(大小:M x N)和 B(大小:N x P)。在 numpy.dot() 结果中,我们只关心掩码 M 中为 1 的元素(大小:M x P)。所以我们想通过跳过掩码中为 0 的那些元素来提高性能。
【问题讨论】:
-
我认为答案将取决于所需元素的结构。您举了一个示例,您只需要产品的对角线。这是您想要的典型输出吗?
-
感谢您的提问!结果掩码是一个具有随机结构的 csr_matrix。
-
我测试了链接答案的稀疏版本,并将其与
Ms.multiply(As*Bs)(具有 3 个稀疏矩阵)进行了比较。对于我的小案例,直接案例更快。As[I,:].multiply(Bs[:,J].T).sum(1)涉及另外 3 个稀疏矩阵产品 - 进行行/列索引和行总和。但替代方案的规模可能会有所不同。 -
A和B也是稀疏的,还是只是M?
标签: python numpy scipy sparse-matrix