在编写一些数组迭代内容时,我遇到了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
开始,最后一个值又消失了。
如果您希望在将范围精确地扩展一步时将数组增加一,这将导致一些明显的问题。
关于为什么行为不一致的任何想法?
系统信息:Python 3.6.5,numpy 1.14.0
答案 0 :(得分:3)
np.linspace文档指出:
使用非整数步骤(例如0.1)时,结果通常将不一致。在这些情况下,最好使用linspace。
因此,您应该考虑改用{{3}}。
您可以使用arange
实现自己的linspace
方法:
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])