numpy 中两个二维掩码数组的快速内积

2024-03-17

我的问题如下。我有两个数组X and Y形状为 n, p 其中p>>n(例如 n = 50,p = 10000)。

我也有口罩mask(大小为布尔值的一维数组p) 关于p, of small密度(例如np.mean(mask)为 0.05)。

我尝试尽可能快地计算内积X and Y关于mask: 输出inner是一个形状数组n, n,并且是这样的inner[i, j] = np.sum(X[i, np.logical_not(mask)] * Y[j, np.logical_not(mask)]).

我尝试过使用numpy.ma库,但对我来说它的使用速度相当慢:

import numpy as np
import numpy.ma as ma
n, p = 50, 10000
density = 0.05
mask = np.array(np.random.binomial(1, density, size=p), dtype=np.bool_)
mask_big = np.ones(n)[:, None] * mask[None, :]
X = np.random.randn(n, p)
Y = np.random.randn(n, p)
X_ma = ma.array(X, mask=mask_big)
Y_ma = ma.array(Y, mask=mask_big)

但后来,在我的机器上,X_ma.dot(Y_ma.T)大约慢5倍X.dot(Y.T)...

首先,我认为这是一个问题.dot殊不知面具只是相对而言p但我不知道是否可以使用这些信息。

我正在寻找一种执行计算的方法,而又不会比天真的点慢很多。

多谢 !


我们可以用matrix-multiplication有和没有屏蔽版本,因为从完整版本中屏蔽减法会产生我们想要的输出 -

inner = X.dot(Y.T)-X[:,mask].dot(Y[:,mask].T)

或者简单地使用反向蒙版,虽然对于稀疏的情况会更慢mask -

inner = X[:,~mask].dot(Y[:,~mask].T)

时间安排 -

In [34]: np.random.seed(0)
    ...: p,n = 10000,50
    ...: X = np.random.rand(n,p)
    ...: Y = np.random.rand(n,p)
    ...: mask = np.random.rand(p)>0.95

In [35]: mask.mean()
Out[35]: 0.0507

In [36]: %timeit X.dot(Y.T)-X[:,mask].dot(Y[:,mask].T)
100 loops, best of 3: 2.54 ms per loop

In [37]: %timeit X[:,~mask].dot(Y[:,~mask].T)
100 loops, best of 3: 4.1 ms per loop

In [39]: %%timeit
    ...: inner = np.empty((n,n))
    ...: for i in range(X.shape[0]):
    ...:     for j in range(X.shape[0]):
    ...:         inner[i, j] = np.sum(X[i, ~mask] * Y[j, ~mask])
1 loop, best of 3: 302 ms per loop
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 中两个二维掩码数组的快速内积 的相关文章

随机推荐

  • 使用 Sleep() 时 Perl 打印功能无法正常工作

    我有以下代码来打印 每秒模拟一个进度条 num 15 while num sleep 1 print 我现在遇到的问题是 每次循环后不打印字符 相反 所有 15 个 循环退出后立即打印 但是 如果我打印 n 它就可以正常工作 但 每次都会打
  • 阻止用户使用 jquery 或 javascript 重新加载页面 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 jQuery Javascript 防止任何形式的页面刷新 https stackoverflow com questions 3527041 prevent any form of page
  • 如何摆脱“打印中的宽字符”?

    我有文件 tmp xxx与下一个内容 00000000 D0 BA D0 B8 D1 80 D0 B8 D0 BB D0 B8 D0 BA 当我读取文件内容并打印它时 出现错误 Wide character in print at 来源是
  • scikit-learn 中预计算内核的网格搜索中的嵌套交叉验证

    我有一个大小为 NxN 的预先计算的内核 我使用 GridSearchCV 来调整 SVM 的 C 参数 其中 kernel precompulated 如下 C range 10 np arange 2 9 param grid dict
  • PCL 上的 TPL,适用于 PCL 配置文件 78 的 MvvmCross

    尝试使用PCL for mvvmcross通过 Profile 78 与 TPL 合作 关于问题mvvmcross 的 PCL 上的 TPL https stackoverflow com questions 16914738 tpl on
  • Spring Boot + JPA2 + Hibernate - 启用二级缓存

    我使用 Spring Boot 1 2 5 和 JPA2 来注释实体 并将 hibernate 作为底层 JPA 实现 我想在该设置中使用二级缓存 因此实 体被注释为 javax persistence Cacheable 我还在 appl
  • Mac OS Xocks代理环境变量

    我知道可以通过网络应用程序设置袜子代理服务器 并且有一个 Mac 特定实用程序可以设置它 但如果可能的话 我更喜欢将袜子代理服务器设置为环境变量 有谁知道合适的export环境 如果有人想知道这对于 http 代理来说是可能的 例如 exp
  • NodeJS 和 C# 中的 AES256 加密/解密

    我对以下问题的结果采取了一些自由态度 NET 中的 AES 加密并使用 Node js 加密解密 https stackoverflow com questions 17306552 aes encrypt in net and decry
  • 图中轴标签隐藏了轴标签吗?

    我正在尝试制作极坐标 sypder 图 但轴标签存在一些问题 x 轴刻度标签似乎总是位于 y 轴网格下方的一层上 字母被网格线覆盖 如下图所示 我希望它们位于顶部 我尝试设置 zorder 但没有成功 如果我将绘制的线的 zorder 设置
  • 从后台进程重定向 stdout 和 stderr

    我有一个名为 foo 的脚本 它运行程序 a exe 并将计时统计信息发送到文件 time log bin bash date 1 gt gt time log time a exe 2 gt gt time log 如果我在终端后台运行脚
  • 将现有 SVN 项目导入 Eclipse

    我在 C 盘上有一个文件夹 该文件夹已从 SVN 中签出 在该文件夹的某个位置 我有一个 Eclipse 项目文件夹 它已经在 SVN 存储库中 我启动了 Eclipse 导入了该项目 但我不知道如何将它连接到 SVN 当我正在做一个CVS
  • PDFBox - 如何创建目录

    有没有办法使用创建目录Java PDFBox图书馆 目录应该是可点击的 跳转到右侧页面 Thanks 没有简单的方法可以做到这一点 但这里有一个方法 我还没有弄清楚如何将链接直接附加到文本 所以我的方法意味着您必须将注释分别绘制为矩形和文本
  • blockui 优于 jQueryUI 模式对话框

    我无法让 BlockUI 在模式对话框上工作 我尝试解决 z index 问题 但没有成功 在我的网页中 这是标题
  • 如何在XtraReport中使用子报表?

    我有一份主要报告 其中包括 详细报告 Transaction Amount Due PaymentType Money Tendered 我还有另一份报告 其中包含订购的物品 物品报告 Transaction ItemName Quanti
  • Python“所有其他元素”习语[重复]

    这个问题在这里已经有答案了 我觉得我花了很多时间用 Python 编写代码 但没有足够的时间创建 Pythonic 代码 最近我遇到了一个有趣的小问题 我认为可能有一个简单 惯用的解决方案 解释一下原文 我需要收集列表中的每个连续对 例如
  • 正在分析的二进制文件必须是可执行文件

    我正在尝试上传一个应用程序供 Apple 审核 但不确定我做错了什么而收到此错误消息 二进制文件必须是可执行文件 zip 文件名看起来应有的样子 项目名称中没有可见的空格 路径末尾的名称除外 示例 ProjectName app zip P
  • 为什么单例类很难测试?

    有效的Java第 3 条 使用私有构造函数或枚举类型强制执行单例属性 指出 将类设置为单例可能会使测试其客户端变得困难 因为不可能用模拟实现替代单例 除非它实现了充当其类型的接口 出于测试目的 为什么实例化一个单例实例并测试其 API 还不
  • 在 chrome 开发工具中隐藏 401 console.error 在 fetch() 调用时获取 401 [重复]

    这个问题在这里已经有答案了 我有一些代码可以进行提取调用 这利用了现代 chrome firefox 中内置的 window fetch api 该代码有时会出现 401 未经授权的响应 这是正常的 我希望忽略它 我可以通过代码流来做到这一
  • 从 Dock 中删除 AppleScript 脚本的图标

    如何隐藏正在运行的 AppleScript 的停靠栏图标 并仅将应用程序保留在菜单栏中 要隐藏应用程序使其不显示在 Dock 中 您需要修改应用程序内的 Info plist 文件 最简单的方法是在 Finder 窗口中选择应用程序 按住
  • numpy 中两个二维掩码数组的快速内积

    我的问题如下 我有两个数组X and Y形状为 n p 其中p gt gt n 例如 n 50 p 10000 我也有口罩mask 大小为布尔值的一维数组p 关于p of small密度 例如np mean mask 为 0 05 我尝试尽