这实际上是一个尴尬的数组问题,所以我将其标记为这样。这也使编写答案变得更容易,因为我可以创建简单的人工案例,而无需将它们放在 ROOT 文件中并用 uproot 将它们读回。
以下是一些人工jetpt
和jeteta
锯齿状的数组:
>>> import awkward
>>> jetpt = awkward.fromiter([[0.0, 1.1, 2.2], [3.3], [4.4, 5.5], [6.6, 7.7, 8.8, 9.9]])
>>> jeteta = awkward.fromiter([[0.1, -1.2, 0.8], [1.2], [-0.8, 0.8], [0.2, -0.3, 0.9, 0.0]])
>>> jetpt, jeteta
(<JaggedArray [[0.0 1.1 2.2] [3.3] [4.4 5.5] [6.6 7.7 8.8 9.9]] at 0x7c2c9e9950b8>,
<JaggedArray [[0.1 -1.2 0.8] [1.2] [-0.8 0.8] [0.2 -0.3 0.9 0.0]] at 0x7c2c9dfb9320>)
这两个锯齿状数组的关键是每个内部数组具有相同数量的内部数组元素:
>>> jetpt.counts, jeteta.counts
(array([3, 1, 2, 4]),
array([3, 1, 2, 4]))
当我们对数组执行数学运算(例如不等式比较)时,这仍然是正确的。(请注意,我们必须为和/或/不使用按位运算符,因为这些是 Numpy 唯一可以重载的运算符。由于按位运算的操作顺序,您还需要括号。)
>>> (-1.0 < jeteta) & (jeteta < 1.0)
<JaggedArray [[True False True] [False] [True True] [True True True True]] at 0x7c2c9dfb9b38>
>>> ((-1.0 < jeteta) & (jeteta < 1.0)).counts
array([3, 1, 2, 4])
由于这些布尔数组具有与 相同的计数jetpt
,因此您可以将它们用作jetpt
任何其他 jet 变量的索引。您不能将它们用作muonpt
等的索引,因为通常每个事件的 μ 子数量与每个事件的喷气机数量不同。(本教程的“03-columnar-data-analysis”笔记本中有更多关于此的内容。)
>>> jetpt[(-1.0 < jeteta) & (jeteta < 1.0)]
<JaggedArray [[0.0 2.2] [] [4.4 5.5] [6.6 7.7 8.8 9.9]] at 0x7c2ca88f8550>
你的第二个问题是关于最多截断三架喷气机。这是一个简单的切片,但适用于第二维。我将把它应用到上面的例子中——它需要是一个单独的方括号,如果你认为这样更容易阅读,你通常会将上面的内容分配给一个变量。
>>> jetpt[(-1.0 < jeteta) & (jeteta < 1.0)][:, :3]
<JaggedArray [[0.0 2.2] [] [4.4 5.5] [6.6 7.7 8.8]] at 0x7c2c9dfdb4a8>
请参阅笨拙的 README了解更多信息!