在编写一些数组迭代内容时,我遇到了numpy arange()
函数的这种奇怪行为:
>>> import numpy as np
>>> np.arange(0.13,0.16, step=0.01)
array([0.13, 0.14, 0.15])
>>> np.arange(0.12,0.16, step=0.01)
array([0.12, 0.13, 0.14, 0.15, 0.16])
>>> np.arange(0.11,0.16, step=0.01)
array([0.11, 0.12, 0.13, 0.14, 0.15])
如您所见,当被要求从0.13
开始时,结果在结束值之前停止一步(因为它应该),但是当要求从0.12
开始时,返回最后一个值!再往下,从 0.11
开始,最后一个值又消失了。
如果您期望在将范围扩展一步时数组增加 1,这会导致一些明显的问题......
关于为什么不一致的行为的任何想法?
系统信息 : 蟒蛇 3.6.5, numpy 1.14.0
np.arange 文档指出:
使用非整数步长(如 0.1)时,结果通常不一致。对于这些情况,最好使用 linspace。
因此,您应该考虑改用 np.linspace。
您可以使用linspace
实现自己的arange
方法:
def my_arange(start, end, step):
return np.linspace(start, end, num=round((end-start)/step), endpoint=False)
它将按预期工作:
In [27]: my_arange(0.13, 0.16, step=0.01)
Out[27]: array([ 0.13, 0.14, 0.15])
In [28]: my_arange(0.12, 0.16, step=0.01)
Out[28]: array([ 0.12, 0.13, 0.14, 0.15])
In [29]: my_arange(0.11, 0.16, step=0.01)
Out[29]: array([ 0.11, 0.12, 0.13, 0.14, 0.15])