2

使用笨拙的数组 1.0 将粒子与ak.combinations. 我在尝试对ak.unzip我所做的组合进行操作时看到错误(按照此处的教程:https ://mybinder.org/v2/gh/jpivarski/2020-07-13-pyhep2020-tutorial.git/1.1?urlpath=实验室/树/tutorial.ipynb)。

我在这里放了一个重现错误的示例:

https://github.com/donalrinho/awkward1_combinatorics_test

并且非常感谢任何帮助理解我做错了什么。我看到的错误是:

Traceback (most recent call last):
  File "python/simple_combiner.py", line 41, in <module>
    pi1, pi2 = ak.unzip(pi_pairs)
ValueError: too many values to unpack (expected 2)

当我将输入数据限制为特定变量时,不会发生错误,例如:

pi_pairs = ak.combinations(pi["pt"], 2)
pi1, pi2 = ak.unzip(pi_pairs)

我只传入数组pt的。pi

4

2 回答 2

2

ValueError: too many values to unpack (expected 2)是一条 Python(不是 Awkward)错误消息,指出赋值右侧的元组的长度不是 2。我们可以得到相同的错误消息,如下所示:

>>> pi1, pi2 = ("a", "b", "c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

所以ak.unzip(pi_pairs)必须有一个不是 2 的长度。ak.unzip所做的就是在给定的数组中找到记录字段,并制作一个元组,其中每一个都被投影出来。获得上述错误消息所需要的只是数组具有多于或少于两个字段。这是一个包含三个的示例:

>>> ak.unzip(ak.Array([{"x": 1, "y": 2, "z": 3}, {"x": 10, "y": 20, "z": 30}]))
(<Array [1, 10] type='2 * int64'>,
 <Array [2, 20] type='2 * int64'>,
 <Array [3, 30] type='2 * int64'>)

ak.combinations函数应该创建一个包含n 个字段的记录数组,其中n是您传递的参数。在您的代码示例中,这似乎是 2,但在我们知道发生了什么之前,您需要打印出ak.zip. 它是否返回一个零项的元组?一?三?更多的?

看起来您正在将其开发为脚本。我建议在 Python 控制台、iPython、Jupyter 等上进行交互式开发。至少当我基于类似 NumPy 的索引构建分析时,我有一半以上的时间会出错,但会立即得到反馈,这样的错误可以在几秒钟内修复。(“哦,是的,我忘了包括...”)pi您传递的 很可能ak.combinations(pi, 2)不是您认为的那样。我建议将其分解并检查小示例(对第一个或两个事件进行切片并在其上调用ak.to_listak.type),向后工作,直到您得到一个按您预期的形状形成的结构。

于 2020-09-15T22:17:06.750 回答
1

非常感谢吉姆的及时反馈,非常有帮助。我尝试zip在做tree.arrays(). 这让我可以像您Muon在教程中所做的那样对事情进行分组(对我来说相当于是pfcharged.core,这只是一个细节)。

然后我有以下代码有效:

arrays = tree.arrays(filter_name="pfcharged.core*",how="zip")
pairs = ak.combinations(arrays["pfcharged.core"],2)
p1, p2 = ak.unzip(pairs)

我不确定使用zipwithtree.arrays()是否是函数运行的先决条件ak.unzip,但无论如何使用zip似乎是一件明智的事情!

干杯,多纳尔

于 2020-09-17T17:10:13.180 回答