【问题标题】:Python: saving numpy array to ROOT filePython:将numpy数组保存到ROOT文件
【发布时间】:2026-01-11 07:55:02
【问题描述】:

所以我和我的研究伙伴正在尝试将一个相当大的 (47104,5) 数组保存到 ROOT 文件中的 TTree 中。 Python 端的数组工作正常。我们可以访问所有内容并运行正常命令,但是当我们运行 root_numpy.array2root() 命令时,我们会得到一个奇怪的错误。

“NoneType”类型的对象没有 len()

我们为此部分运行的代码如下:

import root_numpy as rnp
import numpy as np
import scipy
import logging

def save_array(outputArray, outputName):
    outputString =str(outputName)
    logging.info("Creating .Root file")
    rnp.array2root(outputArray,outputString,treename="Training_Variables",mode="recreate")

我们放置 outputString 变量是为了确保我们将文件名作为字符串放入。 (在我们的 python 终端中,我们在 outputName 的末尾添加 .root 以将其保存为 .root 文件。)。

这是终端的图片。 Showing exact error location in root_numpy

差不多,我们对为什么 array2root() 调用一个对象的 len() 感到困惑,我们认为它不应该有一个 len?它应该只是一个形状。任何见解将不胜感激。

【问题讨论】:

  • 记住要小心确保你有正确的标点符号和语法。看到以小写字母开头的句子会让人分心。
  • 我的错。我会立即改变它。谢谢!
  • 你可以使用hdf5,至少我认为你可以。
  • 什么是 HDF5?但是@Pierre 通过告诉我创建一个结构化数组来帮助我!
  • @zhilothebest 你可以用google来了解hdf5。具体来说,h5py 可能是解决您的问题的最佳解决方案除非您正在与需要使用 ROOT 的人合作。为什么需要使用ROOT?

标签: python arrays numpy root-framework


【解决方案1】:

从 NumPy 数组到 ROOT 数据类型的转换例程适用于结构化数组。请参阅以下两个链接。 (未经测试,但这很可能是问题所在,因为例程使用了arr.dtypes.namesarr.dtypes.fields 属性)。

http://rootpy.github.io/root_numpy/reference/generated/root_numpy.array2tree.html#root_numpy.array2tree

http://rootpy.github.io/root_numpy/reference/generated/root_numpy.array2root.html#root_numpy.array2root

【讨论】:

  • 那是我找到命令的网站。虽然它并没有真正帮助解决问题。编辑: dtypes.names 和 dtypes.fields 到底是什么意思?我不明白第二个句号的用法。
  • 在示例中,数组具有“列名”,即dtype=... 选项。你的数组sig 有那些“列名”吗?如果不是,它们显然无法转换为 ROOT 数据。
  • 有趣。我会尝试一下,让你知道会发生什么。感谢您的建议!
  • 非常感谢!有用!花了一段时间才弄清楚如何制作元组列表,但一旦我弄清楚了,我就有了我的文件。非常感谢!
最近更新 更多