栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

比较NumPy arange和自定义范围函数以产生具有十进制增量的范围

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

比较NumPy arange和自定义范围函数以产生具有十进制增量的范围

端点之间的差异是因为NumPy会预先计算长度而不是临时计算,因为它需要预分配数组。您可以在

_calc_length
助手中看到它。它不会在到达结束参数时停止,而会在到达预定长度时停止。

预先计算长度并不能使您避免非整数步骤的问题,并且无论如何您都会经常得到“错误的”端点,例如,使用

numpy.arange(0.0, 2.1,0.3)

In [46]: numpy.arange(0.0, 2.1, 0.3)Out[46]: array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8,  2.1])

使用它要安全得多

numpy.linspace
,您可以在其中而不是步长上说要多少个元素以及是否要包括正确的端点。


在计算元素时,NumPy似乎没有舍入错误,但这仅仅是由于不同的显示逻辑。NumPy比其更积极地截断显示的精度

float.__repr__
。如果
tolist
用于获取普通的Python标量的普通列表(以及普通的
float
显示逻辑),则可以看到NumPy也遇到了舍入错误:

In [47]: numpy.arange(0, 1, 0.1).tolist()Out[47]: [0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]

舍入误差略有 不同
(例如,在.6和.7中而不是.8和.9中),因为它还使用了不同的方法来计算元素,这些元素在相关dtype的

fill
函数中实现。

fill
函数实现的优点是,它使用
start +i*step
而不是重复添加步骤,从而避免了每次添加都会累积错误。但是,它的缺点是(出于令人信服的原因,我无法看到)它会从前两个元素重新计算步长,而不是将步长作为参数,因此它可能在前一步中失去很多精度。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号