ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

高效归约的艺术:sparse 中 sum、max、min、prod 运算详解

高效归约的艺术:sparse 中 sum、max、min、prod 运算详解 高效归约的艺术sparse 中 sum、max、min、prod 运算详解【免费下载链接】sparseSparse multi-dimensional arrays for the PyData ecosystem项目地址: https://gitcode.com/gh_mirrors/sp/sparse提到sparse很多做数据科学的同学首先想到的是省内存。作为 Sparse multi-dimensional arrays for the PyData ecosystem 的核心实现sparse用 COO、GCXS 等格式只保存非零元素让高维稀疏数组也能轻松放进内存。但存储只是第一步真正让稀疏数组用起来的关键是归约运算reduction。本文将为你详细拆解sparse中最常用的四个归约运算sum求和、max最大值、min最小值与prod连乘从原理到实战一文看懂高效归约的艺术。归约运算是什么为什么稀疏数组更需要它归约reduction指的是沿一个或多个轴把多维数组压缩成更小的数组。比如对一张 1000×1000 的稀疏矩阵求和得到的是一个标量沿某一轴求最大值得到的是向量。sparse严格遵循 NumPy 接口所以写过np.sum、np.max的你几乎可以零成本迁移。在sparse中归约的底层思路是按坐标分组先把所有非零元素按目标轴分组再对每组做聚合如果某组元素不足还会用填充值fill value通常是 0再补算一次。这一整套逻辑位于sparse/numba_backend/_sparse_array.py的reduce方法中并由sparse/numba_backend/_common.py提供函数式封装感兴趣的读者可以顺着这两个模块深入阅读。sparse sum 求和最常用的按轴聚合求和是稀疏数组最频繁使用的归约运算。sum对每个轴上的元素求和当求和轴上的元素不足时自动补零参与计算——这对稀疏数组是天然的友好操作因为零加任何数都不变。import sparse import numpy as np x sparse.COO.from_numpy(np.array([[0, 1], [2, 0]])) print(x.sum(axis1).todense()) # [1, 2] print(x.sum()) # 3用法与 NumPy 完全一致支持axis指定归约轴、keepdims保留维度、dtype指定输出类型、out指定输出位置。官方文档docs/operations.md中给出了完整示例也推荐在动手前先浏览一遍。sparse max / min极值归约的注意事项求极值同样是稀疏场景下的高频操作max与min的 API 与sum几乎相同np.max(x) # 2 np.min(x, axis(0, 1)) # 0 x.max(axis0).todense() # array([2, 1])这里有两个关键点值得新手注意填充值参与比较min在计算时会与填充值0比较因此结果一般不会小于 0这是符合直觉的NaN 传播对于浮点数组一旦某个元素是 NaNmax/min的结果也会是 NaN这与 NumPy 行为一致排查数据时别被吓到。sparse prod 连乘最容易翻车的归约prod连乘是四个归约中最容易踩坑的一个因为稀疏数组省略了零而零参与连乘会让结果直接归零。x.prod() # 0 * 1 * 2 * 0 0上面的例子中矩阵存在零元素所以全局连乘结果必然是 0。如果你的数据里含零且不希望被清零就需要先过滤非零元素或改用sparse的reduce方法配合自定义二元函数。理解这一点能帮你避免很多结果怎么莫名是 0的困惑。进阶玩法用 reduce 实现任意归约sparse不止内置这四个归约还提供了通用入口x.reduce(ufunc, axis)可传入任意 NumPy ufuncx.reduce(np.add, axis1) # 等价于 x.sum(axis1) x.reduce(np.logical_and, axis0) # 等价于 all官方在docs/operations.md中特别提示库会先把坐标分组归约若组内元素不足再补零计算一次因此对多补几个零结果会改变的运算可能不精确但在绝大多数场景下都准确。目前完整支持的方法列表包括sum、max、min、prod、any、all等均可在源码sparse/numba_backend/_sparse_array.py中查阅。性能建议如何让归约更快最后分享三个实战建议优先指定 axis只归约需要的轴能显著减少中间计算量善用 keepdims需要广播或链式运算时保留维度能省去手动 reshape了解后端加速sparse的归约核心由 Numba 编译加速在sparse/numba_backend/目录下可以看到完整的 JIT 实现大数据量下性能相当可观。归约是稀疏数组从存得下走向算得快的桥梁。掌握sum、max、min、prod这四个基础运算再配合reduce通用入口你就能在 PyData 生态中得心应手地处理各类高维稀疏数据了。【免费下载链接】sparseSparse multi-dimensional arrays for the PyData ecosystem项目地址: https://gitcode.com/gh_mirrors/sp/sparse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表