根据您对我的方法的了解,这要么是关于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的每个元素与bvia中的每个元素进行比较,并f过滤掉在应用于. 例如:abf
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和/或你会推荐一种不同的方法来解决我的问题吗?