为什么 np.compress 比布尔索引更快?

2024-03-15

What is np.compress内部做的事情使它比布尔索引更快?

在这个例子中,compress速度提高了约 20%,但节省的时间因数据大小而异a和数量True布尔数组中的值b,但是在我的机器上compress总是更快。

import numpy as np

a = np.random.rand(1000000,4)
b = (a[:,0]>0.5)

%timeit a[b]
#>>> 10 loops, best of 3: 24.7 ms per loop
%timeit a.compress(b, axis=0)
#>>> 10 loops, best of 3: 20 ms per loop

The 布尔索引的文档 https://docs.scipy.org/doc/numpy-1.12.0/user/basics.indexing.html#boolean-or-mask-index-arrays says

返回的是数据的副本,而不是切片获得的视图

相比之下,压缩文档 https://docs.scipy.org/doc/numpy/reference/generated/numpy.compress.html say

返回沿给定轴选定的数组切片”。

然而,使用这里提供的方法 http://ipython-books.github.io/featured-01/用于确定两个数组是否共享相同的数据缓冲区表明这两种方法都不与其父级共享数据a,我认为这意味着这两种方法都不会返回实际的切片。

def get_data_base(arr):
    base = arr
    while isinstance(base.base, np.ndarray):
        base = base.base
    return base

def arrays_share_data(x, y):
    return get_data_base(x) is get_data_base(y) 

arrays_share_data(a, a.compress(b, axis=0))
#>>> False
arrays_share_data(a, a[b])
#>>> False

我只是好奇,因为我在工作中经常执行这些操作。我运行通过 Anaconda 安装的 python 3.5.2、numpy v 1.11.1。


Tracing a.compress通过几层函数调用numpy github我到了

/numpy/core/src/multiarray/item_selection.c
PyArray_Compress(PyArrayObject *self, PyObject *condition, int axis,
             PyArrayObject *out)
    # various checks
    res = PyArray_Nonzero(cond);
    ret = PyArray_TakeFrom(self, PyTuple_GET_ITEM(res, 0), axis,
                       out, NPY_RAISE);

使用您的样本阵列,compress和做一样where得到一个索引数组,然后take:

In [135]: a.shape
Out[135]: (1000000, 4)
In [136]: b.shape
Out[136]: (1000000,)
In [137]: a.compress(b, axis=0).shape
Out[137]: (499780, 4)
In [138]: a.take(np.nonzero(b)[0], axis=0).shape
Out[138]: (499780, 4)
In [139]: timeit a.compress(b, axis=0).shape
100 loops, best of 3: 14.3 ms per loop
In [140]: timeit a.take(np.nonzero(b)[0], axis=0).shape
100 loops, best of 3: 14.3 ms per loop

事实上,如果我在 [] 索引中使用这个索引数组,我会得到可比较的时间:

In [141]: idx=np.where(b)[0]
In [142]: idx.shape
Out[142]: (499780,)
In [143]: timeit a[idx,:].shape
100 loops, best of 3: 14.6 ms per loop
In [144]: timeit np.take(a,idx, axis=0).shape
100 loops, best of 3: 9.9 ms per loop

np.take代码涉及更多,因为它包括clip and wrap modes.

[] 索引被翻译成__getitem__调用,并通过各个层。我还没有发现代码差异很大,但我认为可以肯定地说compress(更确切地说take)只是采取更直接的路线来完成任务,从而获得适度的速度提升。 30-50% 的速度差异表明编译代码细节存在差异,而不是诸如此类的重大差异views vs copies,或解释与编译。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 np.compress 比布尔索引更快? 的相关文章

  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • Spyder 导入模块出错

    我正在尝试在 Spyder 中使用 sklearn 一开始 当我尝试导入它时 我收到 ImportError No module named sklearn 然后我用 PYTHONPATH 管理器设置 PATH 然后使用工具菜单中的 更新模
  • 使用 Pymongo 从 Windows 连接到 AWS 实例上的 MongoDB

    此行反复抛出错误 client MongoClient ec2 12 345 67 89 us east 2 compute amazonaws com 27017 ssl True ssl keyfile C mongo pem 由于显而
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • 使用 boto3 从 s3 下载时使用 filename 作为文件名

    我正在使用 boto3 上传文件 如下所示 client boto3 client s3 aws access key id id aws secret access key key client upload file tmp test
  • 类型错误:需要 Future 或协程

    我尝试在 asyncssh 上自动重新连接 ssh 客户端 SshConnectManager 必须留在后台并在需要时进行 ssh 会话 class SshConnectManager object def init self host u
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • python:是否有用于对输入流进行分块的库函数?

    我想对输入流进行分块以进行批处理 给定一个输入列表或生成器 x in 1 2 3 4 5 6 我想要一个能够返回该输入块的函数 说 如果chunk size 4 then x chunked 1 2 3 4 5 6 这是我一遍又一遍地做的事
  • 如何为 Python 中的应用程序设置专用屏幕区域?

    MS OneNote 就是一个很好的例子 它可以选择固定在屏幕的一侧 并将所有其他窗口推到一侧 当最大化或调整其他窗口大小时 它们只能扩展到 OneNote 的边缘 Python 使用 Tkinter 或其他模块是否具有此功能 感谢您的帮助
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 检查多个 pd.DataFrame 是否相等

    是否有一种 Pythonic 方式 无循环或递归 来检查是否超过两个pd DataFrames 例如 pd DataFrames 列表 彼此相等吗 就像是 all x equals dfs 0 for x in dfs with dfs数据
  • 使用 Python 脚本打开特定文件类型?

    如何使 Python 脚本成为特定文件类型 例如 foo 的默认应用程序 例如 当我双击 Finder Explorer 中的文件时 我希望该文件在 Python 脚本中打开 这可以在 Win 和 或 OS X 中实现吗 如果重要的话 该应
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • Python 中的十进制到二进制半精度 IEEE 754

    我只能使用以下命令将十进制转换为二进制单精度 IEEE754struct pack模块 或者使用相反的方法 float16 或 float32 numpy frombuffer 是否可以使用 Numpy 将十进制转换为二进制半精度浮点数 我
  • 如何将 fields 参数传递到 Google Drive Python API 调用中

    I have results drive service files list body execute where body q query string maxResults 1 为了提高性能 我想限制返回的字段 如下所述 https
  • 如何配置 Eclipse 在使用 Pydev 插件选择“运行”或“调试”时启动浏览器

    我正在使用 Eclipse Pydev 插件学习 Python 和 Django 当我按 运行 或 调试 时 我希望内部或外部浏览器使用 URL http 127 0 0 1 启动或刷新 我见过用 PHP 插件完成的 但没有用 Pydev
  • 在Python中从CSV文件中获取随机行并找到相应的单词,就像测验一样

    抱歉标题含糊不清 想不出更好的表达方式 我有一个包含德语 英语单词的 CSV 文件 如下所示 Ja Yes Nein No Katze Cat 我希望我的 python 脚本从 CSV 文件中打印一个随机的德语单词 并要求他们输入英语单词

随机推荐

  • WordPress 网站中的 jQuery UI 工具提示

    尝试让工具提示使用图片而不是文本 到目前为止 它适用于我网站中的文本 a href title hello world ALOHA a 这工作正常 它在链接悬停时显示 hello world 但如果我尝试以下操作 工作 jsfiddle 示
  • 如何调试生成格式错误的可执行文件的实验工具链

    我正在使用交叉编译一个实验性的 GNU 免费 Linux 工具链clang http clang llvm org 代替gcc compiler rt http compiler rt llvm org 代替libgcc libunwind
  • sql 将单行转换为键/值列

    我有一个返回 1 行的 SQL 查询 其中包含多个列标题 Col 1 Col 2 Col 3 val 1 Val 2 Val 3 有没有办法将此行转换为 2 列 即 Col 1 Val 1 Col 2 Val 2 Col 3 Val 3 这
  • 严格别名警告,创建对 unsigned char 数组 + 偏移量的 uint32_t 引用

    在 GNU GCC 4 7 0 中 我收到了一些严格的别名警告 我想解决这些警告 我有一个有效负载 来自硬件 unsigned char payload davidlt PAYLOAD SIZE 我有这一行 uint32 t payload
  • 新类型的一个覆盖如何显示?

    我想重写 Haskell 中的默认整数构造函数 以便它们生成字符串 主要是出于好奇 但暂时为 LaTeX 的 frac 不便提供一个很好的输入替代方案 我希望能够使用语言本身 而不是特殊的解析器 但我想这可能行不通 module Main
  • 如何使用 Python 和 MySQLdb 检索 mysql 数据库中的表名?

    我有一个 SQL 数据库 想知道您使用什么命令来获取该数据库中的表名列表 更完整一点 import MySQLdb connection MySQLdb connect host localhost user myself passwd m
  • 关于访问 Tuple2 内的字段时发生错误

    我正在尝试访问 Tuple2 中的字段 但编译器返回错误 该软件尝试在 kafka 主题中推送一个案例类 然后我想使用 Spark Streaming 恢复它 这样我就可以提供机器学习算法并将结果保存在 mongo 实例中 Solved 我
  • 简单的数值表达式求解器

    首先 抱歉我的英语不好 对于我的算法和数据结构类的最后一个项目 我需要用 C 创建一个简单的数值表达式求解器 它需要解决简单的表达式 例如3 12 4 6 我设法拆分表达式并将运算符与数字分开 但我无法继续下去 诀窍是将运算符放在二叉树上
  • ELMAH:Elmah 页面未设计样式,使其难以阅读

    Setup 我通过 NuGet 在 ASP NET MVC 4 站点上安装了 ELMAH 在开发机器上 应用程序安装在根目录下 一切正常 并且样式与 ELMAH 页面通常一样 它总是这样做 我的意思是在开发机器上工作 不是吗 但在服务器上
  • PDFView printWithInfo:autoRotate: 失败

    我正在尝试打印一个由一系列图像构建的 PDF 文档 如果重要的话 我会在 Mozilla 插件中完成所有这些工作 我创建 PDFDocument 并将其放入 PDFView 然后调用 printView printWithInfo NSPr
  • Map.keySet 和 Map.values 上的迭代顺序相同吗?

    对于这样的地图 Map
  • dotfuscator并行优化?

    我的公司使用 Dotfuscator 进行 NET 应用程序混淆 它工作得很好 但是我注意到在我们的构建过程中它是一个单线程操作 Dotfuscator exe 始终在我们 8 核构建机器的单个核心上运行 这让我内心有些哭泣 有什么魔法可以
  • Gunicorn 内存使用量和线程不断增长

    我正在 Kubernetes 环境中使用 Gunicorn 运行 Django 应用程序 几周以来 Pod 的内存使用量持续增长 查看进程列表后 我注意到有许多 Gunicorn 进程看似已死 但仍在使用内存 我启动 Gunicorn 的命
  • android - 以编程方式将 ID 设置为视图

    我正在添加Buttons以编程方式和数量Buttons取决于一些条件 添加规则相对布局 LayoutParams that Buttons彼此顶部对齐我需要设置它们IDs 2 3年前的所有答案都说设置 ID int 没问题 例如setId
  • 如何在 Django 中使用 Matplotlib?

    根据网上的一些例子 我编写了下面的测试代码 有用 但是如果我重新加载页面 饼图将使用相同的图像自行绘制 每次重新加载页面时 某些部分都会变得更暗 当我重新启动开发服务器时 它被重置 我该如何正确绘画Matplotlib http en wi
  • 用户通知:自定义振动模式

    是否可以为用户通知警报创建自定义振动模式 例如 我们可以选择为用户通知使用不同的音频 是否也可以有自定义振动模式 我的意思是使用 swift 在 iOS 上以编程方式执行此操作 用于在 iOS 中创建自定义振动 使用 AudioServic
  • ruby 编码::未定义转换错误

    大家好 我正在尝试运行我的第一个 ror 应用程序 并得到以下错误 C Sites myapp gt rails server Could not find gem tzinfo data gt 0 x86 mingw32 in the g
  • 用于修改 machine.config 文件的 API - 每个配置文件中“DbProviderFactories”部分只能出现一次

    我最近在客户端计算机上遇到以下错误 DbProviderFactories 部分在每个配置文件中只能出现一次 计算机配置似乎包含重复的 DbProviderFactories 元素
  • 在使用 IE9 的 Windows 7 上运行 watir-webdriver 时出现问题

    我正在尝试在 64 位 Windows 7 上将 watir webdriver 与 IE9 一起使用 当我尝试打开新浏览器时收到以下错误消息 有什么解决方案吗 C watir gt irb irb main 001 0 gt requir
  • 为什么 np.compress 比布尔索引更快?

    What is np compress内部做的事情使它比布尔索引更快 在这个例子中 compress速度提高了约 20 但节省的时间因数据大小而异a和数量True布尔数组中的值b 但是在我的机器上compress总是更快 import nu