如何使用 np 数组作为锯齿状数组的掩码(python - 尴尬)?

How to use np arrays as a mask for jagged arrays (python - awkward)?

我有一个根文件,我想从中提取每个事件的特定候选人。另一方面,我有一个 numpy 数组,其中包含我要提取的候选人的索引。

假设我的根文件有以下分支:

branch = [[8.956237 9.643666] [5.823581] [3.77208 5.6549993] [5.91686] [13.819047 14.108783]]

我想要前 4 个事件的第一个候选者和最后一个事件的第二个,因此,我有以下 numpy 数组:

npMask = array([[0],[0],[0],[0],[1]])

当我将 npMask 应用到 branch 时,结果不是我所期望的:

branch[npMask]
[[[8.956237 9.643666]] [[8.956237 9.643666]] [[8.956237 9.643666]] [[8.956237 9.643666]] [[5.823581]]]

但是,如果我将 numpy 数组转换为 jagged 数组,它工作得很好:

awkMask = awk.fromiter(npMask)

branch[awkMask]
[[8.956237] [5.823581] [3.77208] [5.91686] [14.108783]]

这里的问题是转换需要太多时间,我使用 iterate 方法和 10k entrysteps,每次迭代转换大约需要 65% 的时间。

所以,我的问题是:是否有使用 numpy 数组作为锯齿状数组掩码的正确方法?



备注

我通过比较三个不同的分支并从这三个分支中选择具有最高值的候选来创建我的 numpy 数组,例如

compare1 = [[0 -0.1] [0] [0.65 0.55] [0.5] [0.6 0.9]]

compare2 = [[0.99 -0.1] [0.9] [0.45 0.2] [0.5] [0.66 0.99]]

compare3 = [[0.91 0.3] [0.77] [0.5 -0.2] [0.5] [0.87 0.59]]

awkward.fromiter 是允许在 Python for 循环中编写的一个函数,因此它被指定为较慢的。将常规 NumPy 数组转换为恰好具有统一计数的 JaggedArrays 所需的函数是 JaggedArray.fromregular。那应该快得多。

同时,您的原始问题是 Awkward 0.x 中不一致的一个例子。在 Awkward 1.x 中,恰好是正则的 Awkward Arrays 的行为与具有相同逻辑含义的 NumPy 数组的行为是相同的。您可能想考虑 awkward1 库中的 awkward1.from_awkward0 来尝试一下。 (因为界面有点不同,所以是一个单独的库,我不想破坏任何人的分析!)