Python库分享: Awkward-array: 使用类似 NumPy 的方式操作类似 JSON 的数据
责任编辑:一颗赛艇     时间:2021-12-31     来源:原创
责任编辑:一颗赛艇
时间:2021-12-31  来源:原创
分类: 开发资源
浏览量: 1013

image.png

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


更加详细的介绍


来源:原创

点赞人: 小甜橘 

小甜橘  回复 2022-01-15 16:08:09

厉害

Eileen  回复 2022-01-03 15:25:26

学到了

回复:

Copyright © 2021 .长沙麦涛网络科技有限公司 All rights reserved. 湘ICP备20015126号-2
联系我们