前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有点坑的 np.array_split

有点坑的 np.array_split

作者头像
Alan Lee
发布2019-08-01 14:58:05
3.4K0
发布2019-08-01 14:58:05
举报
文章被收录于专栏:Small CodeSmall Code
知识共享许可协议
知识共享许可协议

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

假如我们想要把一个 array-like 的东西拆分成多个小组(或者叫 bucket),给定组的数目或者组的大小,最后一组不足则保持原样。

那么我们想到的可能是 np.array_split() 函数。我们使用其官方例子来说明一下。

例子 1:

把一个含有 8 个元素的列表拆分成 3 组,那么 np.array_split() 的结果是:

>>> x = np.arange(8.0)
>>> np.array_split(x, 3)
    [array([ 0.,  1.,  2.]), array([ 3.,  4.,  5.]), array([ 6.,  7.])]

例子 2:

上面的结果好像看起来没啥问题,那么如果列表中含有 7 个元素呢?

>>> x = np.arange(7.0)
>>> np.array_split(x, 3)
    [array([ 0.,  1.,  2.]), array([ 3.,  4.]), array([ 5.,  6.])]

结果每组的大小是 322,很明显不是我们想要的结果,我们想要的结果是 331。

再次查看官方文档,可以看到如下关于该函数如何拆分的解释:

For an array of length l that should be split into n sections, it returns l % n sub-arrays of size l//n + 1 and the rest of size l//n.

也就是说,对于一个长度为 l 的数组,该函数是这么拆的:l % n 个组的大小是 l // n + 1,剩下组的大小是 l // n 其中 // 表示下取整,即 np.floor()

对于例子 1,l 为 8,n 为 3,前 8 % 3 = 2 个组的大小为 8 // 3 + 1 = 3,剩下组的大小为 8 // 3 = 2

对于例子 2,l 为 7,n 为 3,前 7 % 3 = 1 个组的大小为 7 // 3 + 1 = 3,剩下组的大小为 7 // 3 = 2

所以,从直观上来讲,该函数倾向于使得拆分后的组大小分布更为「均衡」,有时候可能不是我们想要的结果,值得注意。

另外,还有一个和 np.array_split 比较相似的函数:np.split(),这两个函数的唯一区别是 split() 必须是等分,否则会抛出异常:ValueError: array split does not result in an equal division

Reference

END

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Reference
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档