对一个JaggedArray中的元素进行尴尬数组测试。

问题描述 投票:0回答:1

我需要对一个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中时,才可以进行计算。

python physics awkward-array
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
© www.soinside.com 2019 - 2024. All rights reserved.