根据您对我的方法的了解,这要么是关于np.unique()
在awkward1
数组上使用的问题,要么是对更好方法的呼吁:
设a
和b
是两个awkward1
具有相同外部长度(事件数)但内部长度不同的数组。例如:
a = [[1, 2], [3] , [] , [4, 5, 6]]
b = [[7] , [3, 5], [6], [8, 9]]
让f: (x, y) -> z
是一个作用于两个数字x
并y
产生数字的函数z
。例如:
f(x, y):= y - x
这个想法是将每个事件a
的每个元素与b
via中的每个元素进行比较,并f
过滤掉在应用于. 例如:a
b
f
f(x, y) < 4
我的方法是:
a = ak.from_iter(a)
b = ak.from_iter(b)
c = ak.cartesian({'x':a, 'y':b})
#c= [[{'x': 1, 'y': 7}, {'x': 2, 'y': 7}], [{'x': 3, 'y': 3}, {'x': 3, 'y': 5}], [], [{'x': 4, 'y': 8}, {'x': 4, 'y': 9}, {'x': 5, 'y': 8}, {'x': 5, 'y': 9}, {'x': 6, 'y': 8}, {'x': 6, 'y': 9}]]
i = ak.argcartesian({'x':a, 'y':b})
#i= [[{'x': 0, 'y': 0}, {'x': 1, 'y': 0}], [{'x': 0, 'y': 0}, {'x': 0, 'y': 1}], [], [{'x': 0, 'y': 0}, {'x': 0, 'y': 1}, {'x': 1, 'y': 0}, {'x': 1, 'y': 1}, {'x': 2, 'y': 0}, {'x': 2, 'y': 1}]]
diff = c['y'] - c['x']
#diff= [[6, 5], [0, 2], [], [4, 5, 3, 4, 2, 3]]
cut = diff < 4
#cut= [[False, False], [True, True], [], [False, False, True, False, True, True]]
new = c[cut]
#new= [[], [{'x': 3, 'y': 3}, {'x': 3, 'y': 5}], [], [{'x': 5, 'y': 8}, {'x': 6, 'y': 8}, {'x': 6, 'y': 9}]]
new_i = i[cut]
#new_i= [[], [{'x': 0, 'y': 0}, {'x': 0, 'y': 1}], [], [{'x': 1, 'y': 0}, {'x': 2, 'y': 0}, {'x': 2, 'y': 1}]]
a
与来自相同元素但来自不同元素的配对可能会b
在切割中幸存下来。(例如{'x': 3, 'y': 3}
和{'x': 3, 'y': 5}
)
我的目标是将具有相同元素的这些对a
组合在一起,从而将new
数组重塑为:
new = [[], [{'x': 3, 'y': [3, 5]}], [], [{'x': 5, 'y': 8}, {'x': 6, 'y': [8, 9]}]]
我唯一的想法如何实现这一点是创建一个索引列表,a
使用以下命令在剪切后仍然存在new_i
:
i = new_i['x']
#i= [[], [0, 0], [], [1, 2, 2]]
但是,我需要此列表的唯一版本以使每个索引仅出现一次。这可以np.unique()
在 NumPy 中实现。但不适用于awkward1
:
np.unique(i)
<__array_function__ internals> in unique(*args, **kwargs)
TypeError: no implementation found for 'numpy.unique' on types that implement __array_function__: [<class 'awkward1.highlevel.Array'>]
我的问题:
他们是np.unique()
等价的awkward1
和/或你会推荐一种不同的方法来解决我的问题吗?