- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个允许步进小数增量的自定义函数:
def my_range(start, stop, step):
i = start
while i < stop:
yield i
i += step
它是这样工作的:
out = list(my_range(0, 1, 0.1))
print(out)
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
现在,这并不奇怪。发生这种情况是可以理解的,因为 float 不准确并且 0.1
在内存中没有准确的表示。因此,这些精度误差是可以理解的。
另一方面,以 numpy
为例:
import numpy as np
out = np.arange(0, 1, 0.1)
print(out)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
有趣的是,这里没有引入明显的不精确度。我认为这可能与 __repr__
显示的内容有关,所以为了确认,我尝试了这个:
x = list(my_range(0, 1.1, 0.1))[-1]
print(x.is_integer())
False
x = list(np.arange(0, 1.1, 0.1))[-1]
print(x.is_integer())
True
所以,我的函数返回了一个不正确的上限值(它应该是 1.0
但实际上是 1.0999999999999999
),但是 np.arange
确实如此它正确。
我知道 Is floating point math broken?但这个问题的重点是:
最佳答案
端点的不同是因为 NumPy 预先计算长度而不是临时计算长度,因为它需要预先分配数组。您可以在 _calc_length
helper 中看到这一点。它不是在达到结束参数时停止,而是在达到预定长度时停止。
预先计算长度并不能使您免于非整数步骤的问题,而且无论如何您都会经常得到“错误”的端点,例如,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 - 因为它还使用不同的方法计算元素,在 fill
function 中实现对于相关的数据类型。
fill
函数实现的优点是它使用start + i*step
而不是重复添加步骤,这避免了每次添加时累积错误。然而,它的缺点是(我看不出有什么令人信服的理由)它从前两个元素重新计算步骤而不是将步骤作为参数,因此它可能会在前面的步骤中失去大量精度。
关于python - 比较 NumPy arange 和自定义范围函数以生成具有小数增量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907088/
我不能解决这个问题。和标题说的差不多…… 如果其他两个范围/列中有“否”,我如何获得范围或列的平均值? 换句话说,我想计算 A 列的平均值,并且我有两列询问是/否问题(B 列和 C 列)。我只希望 B
我知道 python 2to3 将所有 xrange 更改为 range 我没有发现任何问题。我的问题是关于它如何将 range(...) 更改为 list(range(...)) :它是愚蠢的,只是
我有一个 Primefaces JSF 项目,并且我的 Bean 注释有以下内容: @Named("reportTabBean") @SessionScoped public class Report
在 rails3 中,我在模型中制作了相同的范围。例如 class Common ?" , at) } end 我想将公共(public)范围拆分为 lib 中的模块。所以我试试这个。 module
我需要在另一个 View 范围 bean 中使用保存在 View 范围 bean 中的一些数据。 @ManagedBean @ViewScoped public class Attivita impl
为什么下面的代码输出4?谁能给我推荐一篇好文章来深入学习 javascript 范围。 这段代码返回4,但我不明白为什么? (function f(){ return f(); functio
我有一个与此结构类似的脚本 $(function(){ var someVariable; function doSomething(){ //here } $('#som
我刚刚开始学习 Jquery,但这些示例对我帮助不大...... 现在,以下代码发生的情况是,我有 4 个表单,我使用每个表单的链接在它们之间进行切换。但我不知道如何在第一个函数中获取变量“postO
为什么当我这样做时: function Dog(){ this.firstName = 'scrappy'; } Dog.firstName 未定义? 但是我可以这样做: Dog.firstNa
我想打印文本文件 text.txt 的选定部分,其中包含: tickme 1.1(no.3) lesson1-bases lesson2-advancedfurther para:using the
我正在编写一些 JavaScript 代码。我对这个关键字有点困惑。如何在 dataReceivedHandler 函数中访问 logger 变量? MyClass: { logger: nu
我有这个代码: Public Sub test() Dim Tgt As Range Set Tgt = Range("A1") End Sub 我想更改当前为“A1”的 Tgt 的引
我正忙于此工作,以为我会把它放在我们那里。 该数字必须是最多3个单位和最多5个小数位的数字,等等。 有效的 999.99999 99.9 9 0.99999 0 无效的 -0.1 999.123456
覆盖代码时: @Override public void open(ExecutionContext executionContext) { super.open(executio
我想使用 preg_match 来匹配数字 1 - 21。我如何使用 preg_match 来做到这一点?如果数字大于 21,我不想匹配任何东西。 example preg_match('([0-9]
根据docs range函数有四种形式: (range) 0 - 无穷大 (range end) 0 - 结束 (range start end)开始 - 结束 (range start end st
我知道有一个UISlider,但是有人已经制作了RangeSlider(用两个拇指吗?)或者知道如何扩展 uislider? 最佳答案 我认为你不能直接扩展 UISlider,你可能需要扩展 UICo
我正在尝试将范围转换为列表。 nums = [] for x in range (9000, 9004): nums.append(x) print nums 输出 [9000] [9
请注意:此问题是由于在运行我的修饰方法时使用了GraphQL解析器。这意味着this的范围为undefined。但是,该问题的基础知识对于装饰者遇到问题的任何人都是有用的。 这是我想使用的基本装饰器(
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。 到目前为止,我一直在使用 Node.js 结合 requests 和 Cheerio 来拉取页面,然后根据 CSS 选择器查找信息。我已经
我是一名优秀的程序员,十分优秀!