出于我无法理解的原因,Python3仍然不提供内置range()
之类的浮点数生成器对象。
因此输入numpy.arange()
。但是该函数返回一个数组。仅当用于迭代的浮点数组很大时,就没有任何基本意义。对于我来说,这很常见。
numpy中是否存在提供arange()
生成器版本的函数,还是我需要手工对其进行编码?
答案 0 :(得分:1)
range
中缺少浮点支持似乎不是一个大错误。建议的链接显示了各种生成数字的方式。他们还指出了棘手的问题。 numeric_range
也讨论了这些问题。
arange
可以处理浮动步,但会发出警告。
In [79]: np.arange(0,10,1.25)
Out[79]: array([0. , 1.25, 2.5 , 3.75, 5. , 6.25, 7.5 , 8.75])
建议使用 linspace
,以更好地控制端点。为了值得,MATLAB还具有linspace
函数。
In [80]: np.linspace(0,10,9)
Out[80]: array([ 0. , 1.25, 2.5 , 3.75, 5. , 6.25, 7.5 , 8.75, 10. ])
但是我的直觉是缩放range
输出将是最干净的生成器:
In [81]: g = (i*1.25 for i in range(9)) # generator expression
In [82]: list(g)
Out[82]: [0.0, 1.25, 2.5, 3.75, 5.0, 6.25, 7.5, 8.75, 10.0]
其中一个链接答案提示itertools.takewhile
:
In [83]: import itertools
In [86]: g = itertools.takewhile(lambda x: x<10, itertools.count(0,1.25))
In [87]: list(g)
Out[87]: [0, 1.25, 2.5, 3.75, 5.0, 6.25, 7.5, 8.75]
这两个答案都将一个生成器反馈给另一个生成器,这与我在评论中引用的哲学相一致。通过将较小的构建块组合在一起来构建复杂的动作是典型的Python,甚至更numpy
。