Мне нужно выполнить вычисление для JaggedArray, но только если элементы в JaggedArray содержатся в другом JaggedArray. Я хотел бы получить обратно маску с True
, если элемент является другим JaggedArray, или False
в противном случае (ie. Должно быть np.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])
Для неуклюжих0 я получаю:
>>> 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, где обходной путь не работает?
Спасибо!