Awkward Array 是一个用于操作嵌套可变大小数据的库,可操作任意长度的列表、记录、混合类型和缺省数据,其使用类似 NumPy 的语法。
尽管Awkward Array 是动态类型的,但它的操作是经编译的,运行十分快速。 当数组维度是规则的时候,它的操作逻辑与 NumPy 完全一致,不一致时操作规则也大体一致。
操作示例
给定一个包含 x、y 字段和可变长度嵌套列表的数组对象,例如
array = ak.Array([
[{"x": 1.1, "y": [1]}, {"x": 2.2, "y": [1, 2]}, {"x": 3.3, "y": [1, 2, 3]}],
[],
[{"x": 4.4, "y": [1, 2, 3, 4]}, {"x": 5.5, "y": [1, 2, 3, 4, 5]}]
])
下面切片出 y 值,从每个内部列表中删除第一个元素,并对剩下的所有内容运行 NumPy 的 np.square 函数:
output = np.square(array["y", ..., 1:])
结果为
[
[[], [4], [4, 9]],
[],
[[4, 9, 16], [4, 9, 16, 25]]
]
仅使用原生 Python 的代码为
output = []
for sublist in array:
tmp1 = []
for record in sublist:
tmp2 = []
for number in record["y"][1:]:
tmp2.append(np.square(number))
tmp1.append(tmp2)
output.append(tmp1)
使用 Awkward Arrays 的表达式不仅使用更简洁的 NumPy 语法,而且速度更快,占用的内存更少。
对于比上述问题大 1000 万倍的类似问题(在单线程 2.2 GHz 处理器上),使用 Python 列表和字典的实现需要 138 秒,使用 22 GB 内存,而Awkward Array one-liner 仅需要 4.6 秒运行,且只消耗 2.1 GB 内存。当 Awkward Array 与 Numba 结合使用时,甚至可以实现更高的加速。在 SciPy 2020上的报告对这方面的分析有详细的介绍。
安装指南
Awkward Array 可以使用 pip 从 PyPI 安装:
pip install awkward
这会获取到一个预编译的二进制文件(wheel),具体取决于操作系统和Python 版本。 如果没有,pip 会尝试从源代码编译(这将需要 C++ 编译器、make 和 CMake)。
Awkward Array 也可以使用 conda安装,这样会直接安装一个二进制文件:
conda install -c conda-forge awkward
在安装之前,如果已经将 conda-forge 添加为通道,则不需要附加-c conda-forge。推荐将conda-forge通道添加至配置文件,通过如下指令
conda config --add channels conda-forge
conda update --all
更加详细的介绍