0

我需要对 JaggedArray 执行计算,但前提是 JaggedArray 中的元素包含在另一个 JaggedArray 中。True如果元素是另一个 JaggedArray 或False其他(即应该是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()

对于尴尬1,我得到了一个结果,但它似乎是错误的(或者我不确定这意味着什么)。

>>> 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 条目有多个值的情况,解决方法不起作用怎么办?

谢谢!

4

1 回答 1

0

我有可能至少是一种更直接的方法,但我仍然认为它不是很好。我也有兴趣查看其他解决方案。

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
于 2020-06-12T19:17:31.053 回答