我需要对一个JaggedArray进行计算,但只有当JaggedArray中的元素包含在另一个JaggedArray中时才需要。我想接收回一个包含有 True
如果元素是另一个JaggedArray,或 False
否则 np.array
). 我一直在寻找一种在awkward-array 0或1版本中实现这一功能的方法。然而,我还没能找到直接的方法。in
似乎并不奏效,而且我也没有找到等价于 np.isin(...)
(已在 本期,但似乎已经关闭,没有更换)。) 具体来说,我找的是。
import awkward as ak
import numpy as np
# Example arrays:
full_array = ak.fromiter([[1,2,3], [], [0,1,2,3,4,5]])
selected_array = ak.fromiter([[2], [], [7]])
# Desired output
desired_output = np.array([True, False, False])
对于awkward0,我得到的是:
>>> selected_array in full_array
~/.venv/lib/python3.7/site-packages/awkward/array/base.py in __bool__(self)
138
139 def __bool__(self):
--> 140 raise ValueError("The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()")
141
142 __nonzero__ = __bool__
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我还试过一些其他的变化,比如 selected_array.pad(1).fillna(-10).flatten() in full_array
没有成功。我确实找到了一个变通的方法,但似乎很间接。
workaround_array = full_array.ones_like() * selected_array.pad(1).fillna(-100).flatten()
assert (desired_output == (workaround_array == full_array).any()).all()
对于awkward1,我得到了一个结果,但它似乎是错误的(或者我不确定它的意思)。
>>> import awkward1 as ak1
... ak1_full_array = ak1.from_awkward0(full_array)
... ak1_selected_array = ak1.from_awkward0(selected_array)
>>> ak1_selected_array in ak1_full_array
True
有没有更直接的方法来测试JaggedArray中的元素?我是否在某种程度上误用了 in
? 每个JaggedArray条目有多个值的情况下,变通的方法不能用呢?
谢谢!我需要对一个JaggedArray进行计算,但只有当JaggedArray中的元素在JaggedArray中时,才可以进行计算。
我有一个可能至少是更直接的方法,但我仍然不认为它是伟大的。我也很想看到其他的解决方案。
output = ak.fromiter([np.isin(selected_array[index], full_array[index])
for index in range(len(selected_array))])
# This is a JaggedArray with entries [[True], [], [False]]
# output.any() will then match desired_output