如何矢量化(利用 pandas/numpy)而不是使用嵌套 for 循环

2024-02-26

我希望有效地使用pandas (or numpy) 而不是嵌套for循环与if解决特定问题的语句。这是一个玩具版本:

假设我有以下两个 DataFrame

import pandas as pd
import numpy as np

dict1 = {'vals': [100,200], 'in': [0,1], 'out' :[1,3]}
df1 = pd.DataFrame(data=dict1)

dict2 = {'vals': [500,800,300,200], 'in': [0.1,0.5,2,4], 'out' :[0.5,2,4,5]}
df2 = pd.DataFrame(data=dict2)

现在我希望循环遍历每个数据帧的每一行,并在满足特定条件时将值相乘。这段代码适用于我想要的

ans = []

for i in range(len(df1)):
    for j in range(len(df2)):
        if (df1['in'][i] <= df2['out'][j] and df1['out'][i] >= df2['in'][j]):
            ans.append(df1['vals'][i]*df2['vals'][j])

np.sum(ans)

然而,显然这是very效率低下,实际上我的数据帧可能有数百万个条目,这使得它无法使用。我也不是让我们pandas or numpy高效的向量实现。有谁知道如何有效地矢量化这个嵌套循环?

我觉得这段代码类似于矩阵乘法,因此可以利用它取得进展outer?这是if我发现很难融入这种情况,因为if逻辑需要比较每个条目df1针对所有条目df2.


您还可以使用 Numba 等编译器来完成这项工作。这也将优于矢量化解决方案,并且不需要临时数组。

Example

import numba as nb
import numpy as np
import pandas as pd
import time

@nb.njit(fastmath=True,parallel=True,error_model='numpy')
def your_function(df1_in,df1_out,df1_vals,df2_in,df2_out,df2_vals):
  sum=0.
  for i in nb.prange(len(df1_in)):
      for j in range(len(df2_in)):
          if (df1_in[i] <= df2_out[j] and df1_out[i] >= df2_in[j]):
              sum+=df1_vals[i]*df2_vals[j]
  return sum

Testing

dict1 = {'vals': np.random.randint(1, 100, 1000),
         'in': np.random.randint(1, 10, 1000),
         'out': np.random.randint(1, 10, 1000)}
df1 = pd.DataFrame(data=dict1)
dict2 = {'vals': np.random.randint(1, 100, 1500),
         'in': 5*np.random.random(1500),
         'out': 5*np.random.random(1500)}
df2 = pd.DataFrame(data=dict2)

# First call has some compilation overhead
res=your_function(df1['in'].values, df1['out'].values, df1['vals'].values,
                  df2['in'].values, df2['out'].values, df2['vals'].values)

t1 = time.time()
for i in range(1000):
  res = your_function(df1['in'].values, df1['out'].values, df1['vals'].values,
                      df2['in'].values, df2['out'].values, df2['vals'].values)

print(time.time() - t1)

Timings

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

如何矢量化(利用 pandas/numpy)而不是使用嵌套 for 循环 的相关文章

随机推荐

  • 检索 SQL 表中的列数 - C#

    我对 C 很陌生 我正在尝试使用以下方法检索列数 SELECT count FROM sys columns 您能否解释一下如何使用该命令并将其放入变量中 要连接到数据库 您可以使用SqlConnection类 然后要检索行数 您可以使用E
  • 为什么使用数组作为索引会改变多维 ndarray 的形状?

    我有一个 4 D NumPy 数组 轴为 x y z t 我想获取对应于 t 0 的切片并排列 y 轴上的顺序 我有以下内容 import numpy as np a np arange 120 reshape 4 5 3 2 b a 1
  • Xcode Storyboard - 在哪里设置 UITableViewCell 高度

    我正在使用 Xcode 7 并且我正在尝试设置故事板中 UITableViewCell 的高度设置为不同的设备具有不同的单元高度 例如 正常和紧凑 x 常规 我找不到这些设置的位置 这只能通过编程来实现吗 单击 表视图 然后单击 尺寸检查器
  • Flask、mod_wsgi 和 Apache:导入错误

    我在错误日志中收到以下信息 导入错误 没有名为flask的模块 它看起来完全像Django mod wsgi apache 导入错误 没有名为 djproj urls 的模块 https stackoverflow com question
  • 从数据文件夹备份中恢复mysql数据库

    我已经卸载了旧的XAMPP并删除了所有内容d xampp folder并安装了新的 当我复制备份文件夹时 带有我的数据库的名称 包含所有 frm and opt文件 到D xampp mysql data 数据库显示在 phpmyadmin
  • Android Lollipop 不显示 android:背景图像

    我设计了使用 JPEG 图像作为布局背景的屏幕 完整的 UI 屏幕在 Android 8 中正确可见 姜饼 至 Android 19 Kitkat 布局背景在 Android 20 中不可见 Lollipop 我正在使用应用程序兼容性库 请
  • 删除引导程序中标题图像中的细线

    我在标题 菜单中有带有 bootstrap 和 svg sprite 的基本代码 并且图标中有一条细细的灰色背景线 http codepen io anon pen dpzKoQ editors 1100 http codepen io a
  • 无法显示此文件的设计器,因为无法设计其中的任何类

    我们有以下共享组件 public class OurServiceBase System ServiceProcess ServiceBase 此类具有我们在所有下游服务中所需的功能 例如标准化执行调度和日志记录功能 在一个新项目中 我添加
  • 在打字稿中导入html模板

    我试图import我的 html 模板 以便 webpack 能够识别它们并在我构建时包含它们 webpack d 根据这个 GitHub 问题 https github com Microsoft TypeScript issues 27
  • 使用 CLI omxplayer 调整音频音量级别 - Raspberry Pi

    我有一个 bash 脚本 可以通过 omxplayer 在 Raspberry Pi 上播放 mp3 文件 但无法控制本地 耳机 音量GUI 是否有一个命令CLI我可以在 bash 脚本中实现吗 我搜索了很多 但找不到这样的命令 Code
  • “DataView 在 System.data 中未标记为可序列化”是什么意思?

    当我将 dataview 存储在 viewstate 中时 net 显示错误 Dataview 在 system data 中未标记为可序列化 但当我将其存储在会话中时 它可以正常工作吗 背后的原因是什么 还有哪些其他对象没有标记为 可序列
  • 如何将选项传递给“集合”字段 Symfony 2.1 中的 CustomType?

    I have SuperType实体表格Super 在这种形式中我有一个collection现场ChildType实体的表单类型Child class SuperType public function buildForm FormBuil
  • 从 byte[] 下载 PDF 文件

    我一直在努力做一个PDF文件下载自bytes 在 ASP Net MVC C 中 下面的代码工作正常 我需要将代码转换为 NET Core对于相同的PDF下载过程 string fileName testFile pdf byte pdfa
  • 在主屏幕中安装启动器图标一次

    当用户安装 Android 应用程序时 会在应用程序菜单中创建启动器图标 我采访过的许多用户都希望 当他们安装应用程序时 他们的主屏幕 启动板 上应该自动出现一个图标 许多应用程序都以某种方式实现了这一点 我的偏好是在安装时出现一个窗口 询
  • 如何在 VB.Net 中运行 Powershell 脚本

    我需要在 VB Net 中运行 Exchange 2007 powershell 脚本 但我似乎找不到显示如何在加载模块的情况下执行此操作的方法 做到这一点的最佳方法是什么 您可以在VB中运行powershell脚本 请查看以下链接 htt
  • 单击按钮即可更新 D3 等值线州地图数据

    我使用 d3 datamaps 和 topojson 创建了一个 choropleth 州地图 我在根据按钮单击更改原始地图数据时遇到问题 首选方法是仅在更改函数内刷新原始地图的数据 相反 我让按钮执行函数消除包含地图的 div 然后重新创
  • Sqlite3_step() 在此查询上不断返回 SQLITE_MISUSE。有什么指点吗?

    我试图在 viewDidLoad 例程中打开一个 sqlite 数据库 并尝试将 sql 查询发送到该数据库 但 sqlite step 每次都会失败 我不确定这里出了什么问题 我只是尝试将其作为 sqlite3 的 hello world
  • 提交响应后 FormResponse.getId() 返回错误值

    我正在编写一个程序 需要各种谷歌表单响应的ID 我的程序首先创建表单对象并获取响应 var form FormApp openByUrl var allResponses form getResponses 如果表单响应是几个小时前的 那么
  • 转换时区时注意夏令时

    我有一个 Redshift 数据表 其中所有时间值都存储在 CST 中 并且我根据邮政编码 位置 将时间值转换为相应的时区 当我这样做时 我知道所有时间值都是标准时间 因此我的函数用法是 CASE WHEN convert timezone
  • 如何矢量化(利用 pandas/numpy)而不是使用嵌套 for 循环

    我希望有效地使用pandas or numpy 而不是嵌套for循环与if解决特定问题的语句 这是一个玩具版本 假设我有以下两个 DataFrame import pandas as pd import numpy as np dict1