首页 > 解决方案 > 如何使用 np 数组作为锯齿数组的掩码(python - 尴尬)?

问题描述

我有一个根文件,我想从中提取每个事件的某个候选人。另一方面,我有一个 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]])

当我将 应用于 时npMaskbranch结果不是我所期望的:

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]]

标签: uprootawkward-array

解决方案


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

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


推荐阅读