提高 NumPy 数组上的操作性能

2024-01-18

我使用 numpy.delete 从 while 循环内的数组中删除元素。 仅当数组不为空时,此 while 循环才有效。这段代码工作正常但速度变慢 当数组有超过 1e6 个元素时,效果会显着提高。这是一个例子:

while(array.shape[0] > 0):
     ix = where((array >= x) & (array <= y))[0]
     array = delete(array,ix,None)

我试图使这段代码高效,但我找不到加速 while 循环的好方法。我认为这里的瓶颈是删除,它必须涉及某种副本。我尝试过使用掩码数组以避免复制,但我不太擅长 python,而且掩码数组也不那么容易搜索。有没有一种好的、快速的方法来使用删除或替换它,以便上面的循环可以处理 7e6 个元素,而无需花费 24 小时?

Thanks


因此,您可以通过以下方式显着提高代码的性能:

  • 消除循环;和

  • 避免删除操作(这会导致原始数据的副本 大批)

NumPy 1.7 引入了一个新的 mask,它比原来的更容易使用;它的性能也好得多,因为它NumPy 核心数组对象的一部分。我认为这可能对您有用,因为通过使用它您可以避免昂贵的删除操作.

换句话说,不是删除不需要的数组元素,而是屏蔽它们。其他答案中已经建议了这一点,但我建议使用new mask

要使用 NA,只需导入 NA

>>> from numpy import NA as NA

然后对于给定的数组,将 maskna 标志设置为True

>>> A.flags.maskna = True

或者,大多数数组构造函数(从 1.7 开始)都有参数 maskna,您可以将其设置为True

>>> A[3,3] = NA

array([[7, 5, 4, 8, 4],
       [2, 4, 3, 7, 3],
       [3, 1, 3, 2, 1],
       [8, 2, 0, NA, 7],
       [0, 7, 2, 5, 5],
       [5, 4, 2, 7, 4],
       [1, 2, 9, 2, 3],
       [7, 5, 1, 2, 9]])

>>> A.sum(axis=0)
array([33, 30, 24, NA, 36])

通常这不是您想要的——也就是说,您仍然希望 NA 列的总和被视为 0:

要获得该行为,请传入True对于skipma参数(大多数NumPy数组构造函数在NumPy 1.7中都有此参数):

>>> A.sum(axis=0, skipna=True)
array([33, 30, 24, 33, 36])

总之,为了加快代码速度,请消除循环并使用新的掩码:

>>> A[(A<=3)&(A<=6)] = NA

>>> A
array([[8, 8, 4, NA, NA],
       [7, 9, NA, NA, 8],
       [NA, 6, 9, 5, NA],
       [9, 4, 6, 6, 5],
       [NA, 6, 8, NA, NA],
       [8, 5, 7, 7, NA],
       [NA, 4, 5, 9, 9],
       [NA, 8, NA, 5, 9]])

在这种情况下,NA 占位符的行为类似于 0,我相信这就是您想要的:

>>> A.sum(axis=0, skipna=True)
array([32, 50, 39, 32, 31])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高 NumPy 数组上的操作性能 的相关文章

  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element
  • 特定代码行的类似装饰器的语法

    链接主题 但不重复 装饰器对代码的特定行而不是整个方法进行计时 https stackoverflow com questions 30433910 decorator to time specific lines of the code
  • UnicodeDecodeError:“charmap”编解码器|安装 pip python-stdnum==1.8 时出错

    我对编程还很陌生 所以请耐心等待 当我为正在使用的模块安装一些必需的软件包时 我无法安装python stdnum 1 8 我收到以下错误消息 File C Users 59996 AppData Local Programs Python
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 使用 Pandas 解析时避免 Excel 的科学记数法舍入

    我有一个自动生成的 Excel 文件 其中偶尔包含非常大的数字 例如135061808695 在 Excel 文件中 当您单击单元格时 它会显示完整的数字135061808695然而 在视觉上 使用自动 常规 格式 数字显示为1 35063
  • 使用 Pandas 读取带有额外逗号且没有 quotechar 的 CSV?

    Data from io import StringIO import pandas as pd s ID Level QID Text ResponseID responseText date key 375280046 S D3M Wh
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • NoneType 类型的对象没有 len

    def medianeven L while len L gt 2 L L 1 len L 1 return average L def medianodd L while len L gt 1 L L 1 len L 1 return L
  • 如何在 pygame 中水平翻转图像?

    这是在 pygame 如何翻转图像 假设一个图像 猪向右看 时向左看 我按向左箭头键 然后保持这样 即使我不按任何键或者按向上和向下箭头键 那么 当我按向右箭头键时 如何再次将其切换回向右看 并使其保持这种状态 即使我不按任何键或按向上和向
  • 如何在Python中将字符串转换为包含一个元素的列表[重复]

    这个问题在这里已经有答案了 我有一个字符串 我想将其转换为其中只有一个元素的列表 a abc print list a output a b c Expected o p abc 正确的做法是什么 只需使用 a abc b a print
  • Python 的最佳实践:assert command() == False [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在Python中比较枚举?

    从 Python 3 4 开始 Enum类存在 我正在编写一个程序 其中一些常量具有特定的顺序 我想知道哪种方式最适合比较它们 class Information Enum ValueOnly 0 FirstDerivative 1 Sec
  • 在此异步设置中,我在哪里捕获 KeyboardInterrupt 异常

    我正在开发一个使用ccxt异步库 它要求通过显式调用该类的资源来释放某个类使用的所有资源 close 协程 我想退出程序ctrl c并等待异常中的关闭协程 然而 它永远不会被等待 该应用程序由模块组成harvesters strategie
  • Python,socket.error:[Errno 10049]

    在开发一个简单的聊天客户端的基础上 遇到以下错误 socket error Errno 10049 The requested address is not valid in its context 代码是 from socket impo
  • 将 pandas DataFrame 写入 unicode 中的 JSON

    我正在尝试将包含 unicode 的 pandas DataFrame 写入 json 但是内置的 to json函数对字符进行转义 我该如何解决 Example import pandas as pd df pd DataFrame a
  • 采用迭代器而不是可迭代的方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 关于迭代器和可迭代对象 仅是我的观察 如果我错了 请纠正我 大多数构造函数 数组类型 将迭代器作为质量构造函数 迭代器是显式创建的 或
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • 在 django 视图中执行阻塞请求

    在我的 django 应用程序的一个视图中 我需要执行相对较长的网络 IO 操作 问题是其他请求必须等待该请求完成 即使它们与该请求无关 我做了一些研究并偶然发现了 Celery 但据我了解 它用于执行独立于请求的后台任务 所以我不能使用任
  • 在ActivePython-2.6中安装pyCurl?

    我过去曾使用过 pyCurl 并让它与我的系统默认 python 安装一起使用 但是 我有一个项目需要 python 更具可移植性 并且我正在使用 ActivePython 2 6 到目前为止 我安装任何其他模块都没有问题 但安装 pyCu
  • 通过 subprocess.communicate 在 python 脚本之间传输 pickled 对象输出

    我有两个 python 脚本 object generator py 它会腌制给定的对象并打印它 另一个脚本 object consumer py 通过 subprocess communicate 选择第一个脚本的输出 并尝试使用 pic

随机推荐

  • 在 Java 中管理 XAdES 签名的库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个允许创建和验证 XAdES 签名的 Java 库 格式越多越好 XAdES BES XAd
  • 二维unordered_map

    typedef boost unordered map
  • 为什么即使对象指针在多重继承中不同,情况也是一样的?

    当使用多重继承时 C 必须维护多个 vtable 这导致对公共基类有 多个视图 这是一个代码片段 include stdafx h include
  • 具有非静态 lambda 成员的类不能使用默认模板参数吗?

    这个小测试程序 include
  • 通过 .htaccess 从 URL 中删除双斜杠或更多斜杠时出现问题

    我使用以下 htaccess 规则从 Web url 中删除双斜杠或多个斜杠 remove double more slashes in url RewriteCond REQUEST URI RewriteRule 1 2 R 301 L
  • 选定列的高图表不同颜色

    Highcharts 中不同的选定列是否可以有不同的颜色 这是我想做的事情的草图 http jsfiddle net jZmYW 4 http jsfiddle net jZmYW 4 选择一个点 列 时 它应该具有特定的颜色 我尝试通过为
  • XSLT 字符串替换

    我不太了解 XSL 但我需要修复这段代码 我已经减少了它以使其更简单 我收到这个错误 无效的 XSLT XPath 函数 在这条线上
  • Java MVC Web开发框架?

    我想用java开发一个网站 但我在java web开发方面是绝对的初学者 我想使用一个使用 MVC 模式和 Ajax 的框架 我做了一些搜索 发现 Spring 或 Struts 合适 但我不确定 您能推荐一个框架吗 游戏框架 http w
  • .NET - 从非托管数组复制到非托管数组

    我一直在查看 Marshal 类 但似乎找不到允许我从非托管数组 IntPtr 复制到另一个非托管数组 IntPtr 的方法 使用 NET 可以实现这一点吗 您还可以通过 DllImport RtlMoveMemory 来完成工作 DllI
  • 如何使用谷歌翻译应用程序

    我编写了有关字典句子的程序 我希望有功能可以在我的应用程序中转到 谷歌翻译 应用程序 我该如何使用它 我应该导入什么东西吗 据我所知 谷歌翻译 Android 应用程序没有公开任何标准Intent是你可以使用的 很遗憾 但同时也很奇怪 你会
  • Perl 意外行为:croak 与 try catch

    我看到一些异常指向 catch 块本身 参见下面的示例 在我看来 这是一个意想不到的行为 因为它改变了原始异常的位置并使得调试变得困难 应该说在第 13 行处死亡 如果我使用 die confess 或使用 eval 代替 try catc
  • FirebaseApp:Firebase API 初始化失败

    我遇到了由 Firebase Api 引起的错误 这是错误日志 Firebase API initialization failure java lang reflect InvocationTargetException Caused b
  • 哪个 C# 程序集包含 Invoke?

    另一个问题 为什么 VS10 如此热衷于抱怨 Invoke 在我不断追求让我的应用程序工作成为世界上最好的 C 程序员的过程中 我认为线程是一件好事 MSDN 有一篇关于制作的有用文章对控件的线程安全调用 http msdn microso
  • 传递对象时 Axios POST 请求不起作用

    我正在尝试使用 axios 在 vue js 应用程序中向本地 API 发出发布请求 并且响应返回空数据 使用 Postman 工具 API 上的 post 请求工作正常 下面是我的代码 var the data title This is
  • WebClient DownloadString 不返回任何内容

    我想从海盗湾的搜索查询中获取源代码 我的代码中有这个 但它不返回任何内容 WebClient webpage new WebClient string source webpage DownloadString http thepirate
  • FlatList 在添加新数据时重新渲染所有数据

    我测试了 FlatList 这是我想做的 1 使用componentDidmount获取10条初始数据2 向下滚动可获取另外 10 条数据 App js import React from react import View SafeAre
  • 如何防止 Typescript 查看父 node_modules 文件夹

    我在另一个 NPM 包中有一个 NPM 包 子包有一些代码 例如import range from iter tools 即使子 package json 没有依赖项iter tools I am NOT出现任何类型的 Typescript
  • 使用Visual Studio 2010开发nodejs

    是否可以使用VS2010开发NodeJS应用程序 我说的是普通的 Javascript 而不是 Azure 或任何类似的花哨的东西 我只是想使用 VS2010 作为 Javascript 编辑器 因为我有 NET 背景 而且我对它非常满意
  • 允许在数字字段中使用逗号

    这是一个非常愚蠢的问题 我觉得我一定错过了一些简单的事情 我有一个表格quantity场地 人们在输入数量时不断输入逗号 例如 他们输入12 000表示一万二千 所以我想在保存数量之前去掉逗号 12000在示例中 转换为数据库中的整数列 到
  • 提高 NumPy 数组上的操作性能

    我使用 numpy delete 从 while 循环内的数组中删除元素 仅当数组不为空时 此 while 循环才有效 这段代码工作正常但速度变慢 当数组有超过 1e6 个元素时 效果会显着提高 这是一个例子 while array sha