python - 有没有一种简单的方法可以在笨拙的Python库中找到锯齿状数组的最大深度?

标签 python awkward-array

假设我们有一个如下所示的锯齿状数组:

arr = ak.Array([[1, 2, 3], [3, 2], [], [5], [6, 9, 6, 9]])

我们可以看到它的深度为 2。是否有诸如单个或内置函数组合之类的东西可以告诉我这一点?

ak.size 要求我已经知道深度,而 ak.to_numpy -> np.size 会给我一个不兼容的错误。我正在寻找内置的东西,因为我需要它速度快。

谢谢!

编辑: 我忘了提到,我想在保证给定数组具有统一深度并且完全由数字组成的情况下解决这个问题。

最佳答案

实际上,有一个函数可以做到这一点,它位于公共(public) API 中,但不是供数据分析师使用的“高级”部分。它旨在让下游库构建在 Awkward Array 之上(并且 Awkward Array 在内部大量使用它)。

在数组的(低级)布局中,有一个名为minmax_depth的属性。

>>> import awkward as ak
>>> arr = ak.Array([[1, 2, 3], [3, 2], [], [5], [6, 9, 6, 9]])
>>> arr.layout.minmax_depth
(2, 2)

这里,最小值和最大值都是2,因为这是一个相对简单的类型。但异构联合可以有不同的最小值和最大值:

>>> arr = ak.Array([1, [2, 3, [4, 5, 6]]])
>>> arr.layout.minmax_depth
(1, 3)

并且(作为更常见的情况),记录可以引入不同级别的深度:

>>> arr = ak.Array([{"x": 1, "y": [{"z": [[[2]]]}]}])
>>> arr.layout.minmax_depth
(1, 5)

还有一些变体,例如branch_depth( bool 值表示是否分支?和最小深度)和purelist_depth(仅列表和缺失值节点的深度,而不是记录的深度)或工会)。

>>> arr = ak.Array([{"x": 1, "y": [{"z": [[[2]]]}]}])
>>> arr.layout.branch_depth
(True, 1)
>>> arr.layout.purelist_depth
1

事实上,数组的不同部分可以具有不同的深度(与 NumPy 数组不同,在 NumPy 数组中,它始终是 ndim 或 len(shape) ),这一事实对于解释非常重要axis 参数。与 NumPy 不同,负轴可以表示数组不同部分的不同深度级别(因为它是从最深的开始计数,不同部分的深度可能不同)。

>>> arr = ak.Array([{"x": [1, 2, 3], "y": [[1, 2, 3], []]}])
>>> ak.sum(arr, axis=-1)
<Record {x: [6], y: [[6, 0]]} type='{"x": var * int64, "y": var * var * int64}'>

在上面,y 字段比 x 字段深,但 axis=-1 表示沿最深轴求和,无论在哪里也就是说。

关于python - 有没有一种简单的方法可以在笨拙的Python库中找到锯齿状数组的最大深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73338927/

相关文章:

python - 在 Ubuntu 中调用 py 导致 collections.abc 弃用警告

Python 2.7 cx_freeze : What are the risks of removing the encodings that I dont need?

python - 使用 IMDBPy 进行人口统计评级

python - 键在字典 python 中显示为 nan

python - 通过 Python 子进程传递包含 % 的 ffmpeg 命令

arrays - 尴尬数组 : Possible to append an array to an exisitng Parquet file?

python-3.x - 尴尬的数组 : How to get numpy array after storing as Parquet (not BitMasked)?