【问题标题】:How to calculate a numpy.dot() product of two large matrix without calculating part of the result matrix? [duplicate]如何在不计算部分结果矩阵的情况下计算两个大矩阵的 numpy.dot() 乘积? [复制]
【发布时间】: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 个稀疏矩阵产品 - 进行行/列索引和行总和。但替代方案的规模可能会有所不同。
  • AB 也是稀疏的,还是只是 M

标签: python numpy scipy sparse-matrix


【解决方案1】:

使用numpy masked arrays,然后使用通常的 numpy 点积:

import numpy.ma as ma
a = ma.array([[1, 2],[3, 4]], mask=[[0,1],[1,0]])
b = ma.array([[5, 6],[7, 8]], mask=[[0,1],[1,0]])  

np.dot(a,b)


masked_array(data =
 [[19 --]
 [-- 50]],
             mask =
 [[False  True]
 [ True False]],
       fill_value = 999999)

【讨论】:

  • 如果结果掩码是随机的 csr_matrix 怎么办?谢谢!
  • 执行时间相同。
  • 被屏蔽的dot 仍然计算隐藏值。检查np.dot(a,b).datanp.ma 数组不节省时间或内存。
  • np.ma 不适用于sparse.csr_matrix
  • 他原来的qsn没有提到csr矩阵。
猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多