- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 scikit learn 建立一个机器学习项目。输入数据是扁平的 ROOT NTuples。
过去我一直使用 root_numpy 将 NTuples 转换为保存在 h5 文件中的 pandas.DataFrame。
我想知道我是否可以使用 uproot 来
a) 完全跳过 h5 转换?
b) 使用的内存不如从 h5 加载到 DataFrame 中那么多?
我天真的第一次尝试看起来像这样:
'''
Runs preselection, keeps only desired variables in DataFrame
'''
def dropAndKeep(df, dropVariables=None, keepVariables=None, presel=None, inplace=True):
if ((presel is not None) and (not callable(presel))):
print("Please either provide a function to 'presel' or leave blank")
raise ValueError
if callable(presel):
if not(inplace):
df = df.drop(df[~presel(df)].index, inplace=False)
else:
df.drop(df[~presel(df)].index, inplace=True)
if keepVariables is not None:
dropThese = list( set(df.columns) - set(keepVariables) )
return df.drop(columns=dropThese, inplace=inplace)
if dropVariables is not None:
return df.drop(columns=dropVariables, inplace=inplace)
'''
Loads a TTree from ROOT file into a DataFrame
'''
def load_root(inFile, key, dropVariables=None, keepVariables=None, presel=None):
df = uproot.open(inFile)[key].pandas.df()
dropAndKeep(df, dropVariables, keepVariables, presel=presel, inplace=True)
return df
inFile = "path/to/file.root"
key = "ntuple"
df = load_root(inFile, key)
这需要很长时间。有更好的方法吗?
最佳答案
请注意,每次调用 uproot.open(...)
和 file [key]
使用纯 Python 加载 TFile 和 TTree 元数据——uproot 中最慢的部分.如果您多次调用此方法,请尝试保留 TFile 和/或 TTree 对象并重新使用它们。
此外,您的 dropAndKeep
函数看起来只是删除行(事件),但如果我读错了它正在处理列(分支),那么请使用 branches
uproot 的数组读取函数的参数只发送你想要的分支。由于 ROOT 文件中的数据按列排列,您无法避免读取不需要的事件 - 您必须事后删除它们(在任何框架中)。
接下来,请注意,对于过滤事件等简单操作,Pandas 比 NumPy 慢得多。如果您想加快速度,请使用 TTree.arrays
而不是 TTree.pandas.df
获取数组,构建一个 NumPy bool 数组供您选择,然后应用它到 TTree.arrays
返回的字典中的每个数组。然后,您可以使用 Pandas 的 DataFrame 构造函数将所有这些放入 DataFrame 中(如果您真的需要 Pandas)。
的确,您不需要通过 HDF5,也不需要通过 Pandas。您的机器学习框架(TensorFlow?Torch?)几乎肯定有一个接口(interface)可以接受具有零拷贝(或单拷贝到 GPU)的 NumPy 数组。强调 HDF5 或 Pandas 的教程这样做是因为对于大多数用户(非 HEP)来说,这些是最方便的界面。他们的数据可能已经在 HDF5 或 Pandas 中;我们的数据可能在 ROOT 中。
如果您的机器学习将在 GPU 上进行,也许您也想在 GPU 上进行事件选择。 CuPy是一个完全在 GPU 上分配和操作的 NumPy 克隆,并且您的 TensorFlow/Torch 张量可能具有到 CuPy 数组的零拷贝接口(interface)。原则上,如果将 CuPy 数组用作 asarray interpretation 的目标,uproot 应该能够直接从 ROOT 文件写入 CuPy 数组。 .不过我还没有尝试过。
如果您可以控制要处理的 ROOT 文件,请尝试使它们的篮子变大(增加刷新大小)并使它们的数据结构简单(例如,纯数字或数字数组/向量,不要更深)。也许最重要的是,使用像 lz4 这样的轻量级压缩,而不是重量级的 Luke lzma。
Uproot 可以并行读取篮子,但这仅在需要执行大量非 Python 计算(例如解压缩 lzma)时才被证明是有用的。
如果您打算一遍又一遍地读取这些数组,您可能希望使用 numpy.save 编写中间文件,这实际上只是磁盘上的原始字节。这意味着在回读时没有反序列化,而不是解码 ROOT 或 HDF5 文件所需的工作。因为它是一种如此简单的格式,你甚至可以用 numpy.memmap 读回它。 ,当它从磁盘延迟加载数据时,它会窥视操作系统的页面缓存,甚至删除字节的显式副本。
并非所有这些技巧都同样有用。我试着把最重要的放在第一位,但在提交可能不会产生太大影响的大代码重写之前进行试验。有些技巧不能与其他技巧结合使用,例如 CuPy 和 memmap(memmap 总是延迟加载到主内存中,从不加载到 GPU 内存中)。但有些组合可能会富有成效。
祝你好运!
关于python - 打开用于机器学习的 ROOT NTuple 的最快、最节省内存的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58817554/
我在我的实验室中通过终端使用 ROOT,我们经常收集数据并且每小时都有一个文件夹,其中包含微小的 .root 文件。 我正在尝试创建一个每日 .root 文件,其中包含某一天获取的所有数据,目前我有许
我正在创建一些 Docker 镜像,并且正在阅读其他人是如何做到这一点的。当涉及到在容器内运行进程的用户时,我已经确定了三种一般模式: 它使用 root 用户 处理一切(在 root 下运行的容器内生
使用此命令设置密码后: mysqladmin.exe --user=root password 我在“根”用户的用户表中看到 3 行: http://i.stack.imgur.com/Y4Rkd.
我有这个秒表,我试图在计数达到 0 后重置它。但是我在使用“after_cancel”功能时遇到了问题。谁能帮忙? 发生的是它无休止地继续,我想杀死“之后”功能。 def countdown(self
if(file_exists( $_SERVER['DOCUMENT_ROOT'] . "/index.html")) echo '文件存在'; 当文件的所有者和组设置为 root:root 时,仅返
我尝试在 AWS 和 Google Drive 上的 Redhat 7 上安装 MySQL,但是在安装 mysql-server 5.7 后,我收到了相同的错误。 [root@localhost ~]
我试图仅将根域(而不是其子文件夹)重定向到另一个 URL,而不更改地址。我正在使用 .htaccess 并使用 [P] 标志进行重定向,这适用于子目录但不适用于根目录。 编写以下 .htaccess
我正在使用 Apache CGI mod 来允许通过 HTTP(S) 请求执行 python 脚本。问题是我想要执行的脚本 backup.py 在某个时刻执行一个子进程调用,其中 mysqldump
我有一个 script.sh 文件执行以下命令: chown -R apache:apache /var/www/html/my/data 如果我尝试使用非 root 用户(用户名 = marco)执
我目前正在开发一款可以在开车时读出短信/电子邮件的应用程序。许多用户希望支持 WhatsApp/KakaoTalk。 但是,由于没有“官方”方式来接收他们的消息,因此只有三个选项,都需要 root:
我已经看到这个问题问了几次,但从未得到完全回答(我能找到)。 需要说明的是,我的手机已 root。 我需要做的是在 root 拥有的目录下读取和写入文件,例如 /data。我知道我需要使用 super
我有一个 Google Compute Engine VM 实例,上面运行着 Asterisk Server。当我尝试运行 sudo 时收到此消息: sudo: parse error in /etc
我正在使用sail 并尝试以root 身份使用shell,这是不可能的。 切换到 root 用户要求输入密码,我不知道。 我尝试更改 dockerfile: ARG WWWROOTGROUP RUN
rvm 的全部意义在于能够安装多个 ruby 并从用户帐户访问它们。当您需要从 root 访问任何这些 ruby 时,您会怎么做?或者使用安装在其中一个 rvms 中的 gems? 有没有一种优雅的(
我正在尝试在 Openshift 中运行 SonarQube pod,但它似乎正在以 root 作为所有者安装持久卷。 我们如何将其更改为非 root 用户? 我用“hostPath”创建了我的持久卷
我是 Ansible 的新手,我已经创建了我的第一个 Ansible 角色剧本,当我尝试运行它时,它抛出了下面的错误,而角色之外的其他模块(如处理程序、模板)工作正常。我仅通过剧本中的角色观察到这个问
对“以非 root 用户和 root 用户身份运行 docker”感到困惑。 第一个问题(以非root用户运行):基于Post-installation steps for Linux ,要以非 ro
在我的项目中,我发现需要以分层方式打破我的聚合,使用顶级根级别聚合,以确保根级别的规则一致性,然后我的根下的对象可以分组为各种聚合。在计算根级聚合的完整性时,根验证自己的规则,然后委托(delegat
我不知道我是怎么做到的,但在过去几天的某个时候,我设法将我的 MAMP Pro 用户名和密码更改为 root:root 以外的其他名称。我一直在本地开发 Wordpress 版本,所以它一定是我当时做
update user set host='%' where user='root 之后,我失去了我的 MySQL root 用户的一些权限。所以我停止了服务器并用 --skip-grant-tabl
我是一名优秀的程序员,十分优秀!