无法从 Python 中的 uproot 加载数据
Can't load data from uproot in Python
我正在尝试从 uproot 加载希格斯玻色子数据集。我不习惯使用 uproot 和 .root 数据类型。我正在使用以下代码,这是一种加载库的官方说明。我做了一个虚拟环境并安装了必要的库
import oamap.source.root
import uproot
events = uproot.open("http://scikit-hep.org/uproot/examples/HZZ.root")["events"].oamap()
我在 运行 上述示例代码时遇到以下错误。
Traceback (most recent call last):
File "main.py", line 4, in <module>
events = uproot.open("http://scikit-hep.org/uproot/examples/HZZ.root")["events"].oamap()
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 187, in __call__
generator = self.schema.generator()
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 184, in schema
return oamap.schema.List(recurse(self.tree), starts="", stops="")
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 138, in recurse
x = frominterp(name, branch, uproot.interp.auto.interpret(branch))
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 100, in frominterp
return oamap.schema.Primitive(interpretation.todtype, data=name)
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/schema.py", line 346, in __init__
self.data = data
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/schema.py", line 418, in data
raise TypeError("data must be None or an array name (string), not {0}".format(repr(value)))
TypeError: data must be None or an array name (string), not b'NJet'
我是这类加载数据集的新手。
Python 2 和 3 对字节字符串和 unicode 字符串的处理不同:Python 2 隐式转换(弱,动态类型),但 Python 3 抱怨(强烈,动态类型)。
来自 ROOT 文件的名称是字节字符串,因为 ROOT 不提供编码。他们都只是 "char *"。适当的 Python 类型是字节串。
OAMap 只是不想处理这个——数组名称是字符串,在 unicode 中表示任何内容。在 Python2 中,隐式分配了一个编码来实现这一点; Python 3 对编码的分配方式更加严格。它与 ROOT 的连接器可能缺少处理未编码字节字符串的案例。
切换到 Python 2 以便轻松修复。
我正在尝试从 uproot 加载希格斯玻色子数据集。我不习惯使用 uproot 和 .root 数据类型。我正在使用以下代码,这是一种加载库的官方说明。我做了一个虚拟环境并安装了必要的库
import oamap.source.root
import uproot
events = uproot.open("http://scikit-hep.org/uproot/examples/HZZ.root")["events"].oamap()
我在 运行 上述示例代码时遇到以下错误。
Traceback (most recent call last):
File "main.py", line 4, in <module>
events = uproot.open("http://scikit-hep.org/uproot/examples/HZZ.root")["events"].oamap()
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 187, in __call__
generator = self.schema.generator()
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 184, in schema
return oamap.schema.List(recurse(self.tree), starts="", stops="")
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 138, in recurse
x = frominterp(name, branch, uproot.interp.auto.interpret(branch))
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/source/root.py", line 100, in frominterp
return oamap.schema.Primitive(interpretation.todtype, data=name)
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/schema.py", line 346, in __init__
self.data = data
File "/home/akash/DIANAhep/lib/python3.5/site-packages/oamap/schema.py", line 418, in data
raise TypeError("data must be None or an array name (string), not {0}".format(repr(value)))
TypeError: data must be None or an array name (string), not b'NJet'
我是这类加载数据集的新手。
Python 2 和 3 对字节字符串和 unicode 字符串的处理不同:Python 2 隐式转换(弱,动态类型),但 Python 3 抱怨(强烈,动态类型)。
来自 ROOT 文件的名称是字节字符串,因为 ROOT 不提供编码。他们都只是 "char *"。适当的 Python 类型是字节串。
OAMap 只是不想处理这个——数组名称是字符串,在 unicode 中表示任何内容。在 Python2 中,隐式分配了一个编码来实现这一点; Python 3 对编码的分配方式更加严格。它与 ROOT 的连接器可能缺少处理未编码字节字符串的案例。
切换到 Python 2 以便轻松修复。