如何通过0.1的步长在0和1之间进行迭代?
这说明步长参数不能为零:
for i in range(0, 1, 0.1):
print(i)
如何通过0.1的步长在0和1之间进行迭代?
这说明步长参数不能为零:
for i in range(0, 1, 0.1):
print(i)
不要直接使用十进制步长,最好以您希望获得的点数来表达。否则,浮点舍入误差可能会给您带来错误的结果。
使用NumPy库中的linspace
函数(它不是标准库的一部分,但相对容易获取)。linspace
需要返回点数,并且还允许您指定是否包括右端点:
>>> np.linspace(0,1,11)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
numpy.arange
:>>> import numpy as np
>>> np.arange(0.0, 1.0, 0.1)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
浮点数舍入误差会导致问题。这里有一个简单的例子,其中舍入误差导致arange
生成长度为4的数组,而实际上只应该生成3个数字:
>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])
np.linspace(1.,1.3,4)
和np.arange(1.,1.3,0.1)
给出的输出完全相同。请问是否需要翻译其他内容? - deadcode[start,stop)
(即不包含 stop
),因此我们不应该预期 1.3 会被包含在列表中。请参考这个问题,了解为什么它仍然被包含以及如何避免。 - dennis(x * 0.1 for x in range(0, 10))
。 - JABx/10
代替x*0.1
:D 实际上并没有什么特别之处,但其中一些数字会更精确,例如 3*0.1
会得到 0.30000000000000004
,而使用3/10则可以得到 0.3
:) - Blokefrom __future__ import division; 3/10
语句将返回0.3。在Python 3.x中,默认情况下也是如此。 - Benjamin Hodgson在'xrange([start], stop[, step])'的基础上,您可以定义一个生成器,它接受并生成任何您选择的类型(仅限支持+
和<
的类型):
>>> def drange(start, stop, step):
... r = start
... while r < stop:
... yield r
... r += step
...
>>> i0=drange(0.0, 1.0, 0.1)
>>> ["%g" % x for x in i0]
['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1']
>>>
l=frange(0,1,0.1)
print l
输出结果为:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]
但是使用Numpy时,结果为:
[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
- andilabsi = 0; r = start while r < stop: i += 1; r = start + i * step; yield r
- Cees Timmerman增加循环中的大小,需要时再减小。
for i * 100 in range(0, 100, 10):
print i / 100.0
编辑:老实说,我真的不记得我为什么认为那样在语法上会起作用了。
for i in range(0, 11, 1):
print i / 10.0
那应该会得到期望的输出。
for i * 100 in range(0, 100, 10)
:
语法错误:无法将值赋给运算符。 - Anne van Rossum我认为NumPy有点过头了。
[p/10 for p in range(0, 10)]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
一般来说,要从1/x
做到y
的步进操作需要执行以下代码:
x=100
y=2
[p/x for p in range(0, int(x*y))]
[0.0, 0.01, 0.02, 0.03, ..., 1.97, 1.98, 1.99]
(在我的测试中,1/x
产生的舍入误差较少。)
scipy
内置了一个名为arange
的函数,它是对Python的range()
构造器的推广,以满足您处理浮点数的需求。
from scipy import arange
arange
函数:`>>> import scipy- iFreilichtimport numpy >>> numpy.arange is scipy.arange将返回
True`。
类似于R语言中的seq
函数,该函数可以按照指定的步长返回任意顺序的数列,其中最后一个值等于停止值。
def seq(start, stop, step=1):
n = int(round((stop - start)/float(step)))
if n > 1:
return([start + step*i for i in range(n+1)])
elif n == 1:
return([start])
else:
return([])
seq(1, 5, 0.5)
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
seq(10, 0, -1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
seq(10, 0, -2)
[10, 8, 6, 4, 2, 0]
seq(1, 1)
[ 1 ]
seq(0.5, 3.0)
返回 [0.5, 1.5, 2.5, 3.5]
。为了避免最后一个条目超出范围,请将 n = int(round(...
替换为 n = int(floor(...
并在顶部(def seq(...
上面)添加行 from math import floor
。 - FriendFXrange() 函数返回整数值序列,所以无法使用它进行小数步长。我建议使用 while 循环:
i = 0.0
while i <= 1.0:
print i
i += 0.1
如果你好奇,Python 将你的 0.1 转换为 0,这就是为什么它告诉你参数不能为零的原因。以下是使用itertools的解决方案:
import itertools
def seq(start, end, step):
if step == 0:
raise ValueError("step must not be 0")
sample_count = int(abs(end - start) / step)
return itertools.islice(itertools.count(start, step), sample_count)
使用示例:
for i in seq(0, 1, 0.1):
print(i)
[x * 0.1 for x in range(0, 10)]
在 Python 2.7x 中执行以下代码会得到如下结果:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]
但如果你使用以下代码:
[ round(x * 0.1, 1) for x in range(0, 10)]
给你想要的结果:
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
itertools.takewhile
和itertools.count
来编写一个简短的一行代码。尽管性能不如drange
。 - Kosseq 0 0.1 1
! - joschseq
在内部使用 C 语言的long double
类型,因此可能会出现舍入误差。例如在我的电脑上,seq 0 0.1 1
的最后一个输出为1
(如预期),但seq 1 0.1 2
的最后一个输出为1.9
(而不是预期的2
)。 - Mark Dickinsonitertools.takewhile(lambda x: (x+0.05)<1, itertools.count(0,0.1))
或itertools.islice(itertools.count(0,0.1), 10)
(在你有import itertools
之后),不过我还没有测试哪种更有效。 - LHeng