当我在评论中提到np.searchsorted是您应该查找的地方时,我没有注意到它myDict
包含每个连续整数作为键。拥有像这样的密集查找表将允许更快的算法,这在 Awkward Array 中也恰好更简单。
因此,假设myDict
每个整数0
到某个值都有一个键,您同样可以将查找表表示为
>>> lookup = ak.Array([myDict[i] for i in range(len(myDict))])
>>> lookup
<Array [19.5, 34.1, 10.9] type='3 * float64'>
0
在、1
和处取值的问题2
变成了一个数组切片。(此数组切片是数组长度n的O(n)算法,与 不同的是O(n log n)。这是拥有稀疏查找键的成本。)np.searchsorted
然而,问题在于它myArray
是嵌套的而lookup
不是嵌套的。我们可以给出与切片lookup
相同的深度:myArray
>>> multilookup = lookup[np.newaxis][np.zeros(len(myArray), np.int64)]
>>> multilookup
<Array [[19.5, 34.1, 10.9, ... 34.1, 10.9]] type='2 * 3 * float64'>
>>> multilookup.tolist()
[[19.5, 34.1, 10.9], [19.5, 34.1, 10.9]]
然后multilookup[myArray]
正是你想要的:
>>> multilookup[myArray]
<Array [[19.5, 34.1], [10.9, 34.1, 19.5]] type='2 * var * float64'>
必须重复查找,因为其中的每个列表都myArray
使用全局索引lookup
。如果创建所涉及的内存multilookup
令人望而却步,则可以改为分解myArray
以匹配它:
>>> flattened, num = ak.flatten(myArray), ak.num(myArray)
>>> flattened
<Array [0, 1, 2, 1, 0] type='5 * int64'>
>>> num
<Array [2, 3] type='2 * int64'>
>>> lookup[flattened]
<Array [19.5, 34.1, 10.9, 34.1, 19.5] type='5 * float64'>
>>> ak.unflatten(lookup[flattened], nums)
<Array [[19.5, 34.1], [10.9, 34.1, 19.5]] type='2 * var * float64'>
如果您的密钥不密集0
到某个整数,那么您将不得不使用np.searchsorted
:
>>> keys = ak.Array(myDict.keys())
>>> values = ak.Array([myDict[key] for key in keys])
>>> keys
<Array [0, 1, 2] type='3 * int64'>
>>> values
<Array [19.5, 34.1, 10.9] type='3 * float64'>
在这种情况下,它们keys
是微不足道的,因为它是密集的。使用 时np.searchsorted
,您必须将平面 Awkward Arrays 显式转换为 NumPy(目前;我们正在寻求解决该问题)。
>>> lookup_index = np.searchsorted(np.asarray(keys), np.asarray(flattened), side="left")
>>> lookup_index
array([0, 1, 2, 1, 0])
然后我们keys
在将它传递给values
.
>>> keys[lookup_index]
<Array [0, 1, 2, 1, 0] type='5 * int64'>
>>> values[keys[lookup_index]]
<Array [19.5, 34.1, 10.9, 34.1, 19.5] type='5 * float64'>
>>> ak.unflatten(values[keys[lookup_index]], num)
<Array [[19.5, 34.1], [10.9, 34.1, 19.5]] type='2 * var * float64'>
但我在昨天的评论中胡思乱想的事情是,您必须在myArray
( ) 的扁平形式上执行此操作,然后在ak.unflattenflattened
之后重新引入结构,如上所述。但也许我们应该至少在第二个参数中识别出一个完全结构化的 Awkward Array 。(它必须是非结构化的才能出现在第一个参数中。)np.searchsorted
ak.searchsorted