改进最小/最大下采样

2024-03-21

我有一些大型数组(约 1 亿点)需要以交互方式绘制。我目前正在使用 Matplotlib。按原样绘制数组会变得非常慢并且很浪费,因为无论如何您都无法可视化那么多点。

因此,我创建了一个最小/最大抽取函数,并将其与轴的“xlim_changed”回调绑定在一起。我采用了最小/最大方法,因为数据包含快速峰值,我不想通过单步浏览数据而错过这些峰值。还有更多包装器会裁剪到 x 限制,并在某些条件下跳过处理,但相关部分如下:

def min_max_downsample(x,y,num_bins):
    """ Break the data into num_bins and returns min/max for each bin"""
    pts_per_bin = x.size // num_bins    

    #Create temp to hold the reshaped & slightly cropped y
    y_temp = y[:num_bins*pts_per_bin].reshape((num_bins, pts_per_bin))
    y_out      = np.empty((num_bins,2))
    #Take the min/max by rows.
    y_out[:,0] = y_temp.max(axis=1)
    y_out[:,1] = y_temp.min(axis=1)
    y_out = y_out.ravel()

    #This duplicates the x-value for each min/max y-pair
    x_out = np.empty((num_bins,2))
    x_out[:] = x[:num_bins*pts_per_bin:pts_per_bin,np.newaxis]
    x_out = x_out.ravel()
    return x_out, y_out

这工作得很好并且足够快(在 1e8 点和 2k bin 上约为 80 毫秒)。由于它定期重新计算和更新线路的 x 和 y 数据,因此几乎没有延迟。

然而,我唯一的抱怨是 x 数据。此代码复制每个 bin 左边缘的 x 值,并且不返回 y 最小/最大对的真实 x 位置。我通常将箱数设置为轴像素宽度的两倍。所以你真的看不出区别,因为垃圾箱太小了……但我知道它在那里……这让我很烦恼。

因此,尝试第 2 种方法,它确实返回每个最小/最大对的实际 x 值。然而,速度慢了大约 5 倍。

def min_max_downsample_v2(x,y,num_bins):
    pts_per_bin = x.size // num_bins
    #Create temp to hold the reshaped & slightly cropped y
    y_temp = y[:num_bins*pts_per_bin].reshape((num_bins, pts_per_bin))
    #use argmax/min to get column locations
    cc_max = y_temp.argmax(axis=1)
    cc_min = y_temp.argmin(axis=1)    
    rr = np.arange(0,num_bins)
    #compute the flat index to where these are
    flat_max = cc_max + rr*pts_per_bin
    flat_min = cc_min + rr*pts_per_bin
    #Create a boolean mask of these locations
    mm_mask  = np.full((x.size,), False)
    mm_mask[flat_max] = True
    mm_mask[flat_min] = True  
    x_out = x[mm_mask]    
    y_out = y[mm_mask]  
    return x_out, y_out

在我的机器上,这大约需要 400 多毫秒,这变得非常明显。所以我的问题基本上是有没有办法更快并提供相同的结果?瓶颈主要在于numpy.argmin and numpy.argmax比以下函数慢一点numpy.min and numpy.max.

答案可能是只接受版本#1,因为它在视觉上并不重要。或者尝试加快速度,例如 cython (我从未使用过)。

仅供参考,在 Windows 上使用 Python 3.6.4 ...示例用法如下:

x_big = np.linspace(0,10,100000000)
y_big = np.cos(x_big )
x_small, y_small = min_max_downsample(x_big ,y_big ,2000) #Fast but not exactly correct.
x_small, y_small = min_max_downsample_v2(x_big ,y_big ,2000) #correct but not exactly fast.

我设法通过使用输出来提高性能arg(min|max)直接索引数据数组。这是以额外调用为代价的np.sort但要排序的轴只有两个元素(最小/最大索引),并且整个数组相当小(箱数):

def min_max_downsample_v3(x, y, num_bins):
    pts_per_bin = x.size // num_bins

    x_view = x[:pts_per_bin*num_bins].reshape(num_bins, pts_per_bin)
    y_view = y[:pts_per_bin*num_bins].reshape(num_bins, pts_per_bin)
    i_min = np.argmin(y_view, axis=1)
    i_max = np.argmax(y_view, axis=1)

    r_index = np.repeat(np.arange(num_bins), 2)
    c_index = np.sort(np.stack((i_min, i_max), axis=1)).ravel()

    return x_view[r_index, c_index], y_view[r_index, c_index]

我检查了你的例子的时间,我得到了:

  • min_max_downsample_v1:110毫秒±5毫秒
  • min_max_downsample_v2:240毫秒±8.01毫秒
  • min_max_downsample_v3:164毫秒±1.23毫秒

我还检查了在致电后直接返回arg(min|max)结果同样是 164 毫秒,即之后就不再有真正的开销了。

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

改进最小/最大下采样 的相关文章

  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 从 scikit-learn 导入 make_blobs [重复]

    这个问题在这里已经有答案了 我收到下一个警告 D Programming Python ML venv lib site packages sklearn utils deprecation py 77 DeprecationWarning
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • javascript 中剩余参数和展开运算符的用法

    ECMAScript 6中添加的rest参数有什么用 例如 在 ECMAScript 5 中 您可以执行以下操作来获取从第二个元素开始的参数数组 ES 5 store Joe money store Jane letters certifi
  • 根据 UICollectionView 中的图像动态更改单元格大小

    我正在水平集合视图中显示从服务器接收的动态图像 当我设置集合视图时 我设置了 void setupCollectionView self setupPageControlView self screensCollectionView del
  • 提高识别率的图像预处理步骤

    我正在为我的项目使用 TessBaseAPI 制作一个简单的 OCR Android 应用程序 我已经完成了一些图像预处理步骤 例如二值化和图像增强 但他们的结果是50 到60 怎样才能提高识别率呢 我包括两个示例图像 http image
  • 关于Environment.ProcessorCount的问题

    我很好奇 NET 属性是什么Environment ProcessorCount实际上返回 它返回核心数量 处理器数量还是两者都返回 如果我的计算机有 2 个处理器 每个处理器有 4 个核心 Environment ProcessorCou
  • 如何计算 React Native/JS 中 JSON 响应的长度?

    我想计算我的响应 JSON 的长度 这是我的代码 getMoviesFromApiAsync return fetch http sampleurl com CommonDataManager getInstance getUserID t
  • Android:当应用程序被终止时从服务启动活动

    在我的应用程序中 我有一个Service在后台 和前台 运行 In this Service 有一个CountdownTimer当它完成时 我想在某个特定的时间启动该应用程序Activity并在中做一些事情Activity自动 并且即使我的
  • 如何在 VS Code 中跨多个文件执行命令?

    我想通过运行一些命令来优化我的打字稿代码 例如resolve organizeImports我的所有打字稿 ts 文件中都带有 TS Hero 插件 逐个文件地执行此操作可能非常烦人且耗时 有没有一种简单的方法来进行这种 批量 执行 我已经
  • Moment.js 月份差异

    我已经使用 moment js 有一段时间了 它使日期操作变得更加容易 但我有一个失败的特定案例 我不明白为什么 计算今天 2013 年 10 月 31 日 和 2014 年 2 月 1 日之间的差异时 月份差异返回为 2 尽管两个日期之间
  • JQuery:获取不包括嵌套标签的标签内容

    我有一些如下所示的 HTML span Text I m interested in span Other crap I don t care about span span 我希望获取跨度 A 的文本内容 不包括任何嵌套标签 即上例中跨度
  • Nestjs Mongoose 服务的单元测试

    我一直在试图弄清楚如何对 NestJS 服务进行单元测试 所以我写了一个规范文件来测试这些使用 mongoose 和 jest 的 NestJS 服务 规格文件如下 import Test TestingModule from nestjs
  • 如何获取MEF中的所有方法

    我有属性类 AttributeUsage AttributeTargets Method public class MethodGetterAttribute ExportAttribute 我在几个命名空间的方法中使用它 namespac
  • 使用reduce删除数组中的重复项

    我正在尝试从数组列表中删除重复项 我尝试执行此操作的方法是使用reduce 创建一个空数组 将所有未定义的索引推送到该数组上 但我收到错误 if acc item undefined TypeError Cannot read proper
  • 如何查看CK编辑器版本

    我的项目中有一个现有的 CK 编辑器文件夹 我怎样才能知道它的版本 有记录吗 只需在 config js 文件中发出如下警报 它就会给出值 alert CKEDITOR version 或者您可以直接在文件 ckeditor php4 ph
  • 是否可以将一个操作附加到 boost::spirit::rule 解析器,该解析器将解析结果分配给(尚)未知实例的成员?

    我试图从 boost spirit 规则定义的操作中引用 尚 未知实例的成员 因此在伪代码中 代替 双 参考 rN 1 我正在寻找类似的东西 X 像素 double ref X rN ppx 1 它的解决方法可能是一个简单的 语义操作 其参
  • Google Maps API v3 MapTypeId 作为变量

    设置谷歌地图类型时 map setMapTypeId google maps MapTypeId TERRAIN 我可以用包含字符串 TERRAIN SATELLITE 等的js变量替换 TERRAIN 吗 是的 这样称呼它 var map
  • AVPlayer 在模拟器上可以播放,但在真实设备上却无法播放

    我正在实现一个基本的音频播放器来播放远程音频文件 文件格式为 mp3 我编写的代码在模拟器上运行良好 但在真实设备上不起作用 然而 如果我使用 safari 在同一个真实设备上 加载它 我在应用程序中使用的相同 url 工作正常 所以我并没
  • 为什么PHP APC缓存未命中不断增加

    我正在使用 apc php 检查 PHP APC 的统计信息 http svn php net viewvc pecl apc trunk apc php 我在相当繁忙的服务器上有以下统计数据 Cached Files 317 26 3 M
  • Recyclerview 中的 Exoplayer 错误,源错误 没有可用的提取器

    我正在使用 ExoPlayer 在 RecyclerView 中流式传输视频 我正在 ViewHolder 内的 RecyclerView 适配器的绑定方法中实现 ExoPlayer 我使用的视频格式是 m3u8 我使用的 URL 在浏览器
  • 我如何使用 PHP 获取当前月份和前三个月

    谁能告诉我如何使用 PHP 获取当前月份和前三个月 例如 echo date y M d 输出将为 09 Oct 20 但是我需要 August 九月 October 作为输出 提前致谢 Fero 对于月份的完整文本表示 您需要传递 F e
  • 改进最小/最大下采样

    我有一些大型数组 约 1 亿点 需要以交互方式绘制 我目前正在使用 Matplotlib 按原样绘制数组会变得非常慢并且很浪费 因为无论如何您都无法可视化那么多点 因此 我创建了一个最小 最大抽取函数 并将其与轴的 xlim changed