是否有numpy版本的arange()返回生成器对象而不是整个数组?

时间:2019-05-09 00:59:41

标签: python python-3.x numpy

出于我无法理解的原因,Python3仍然不提供内置range()之类的浮点数生成器对象。

因此输入numpy.arange()。但是该函数返回一个数组。仅当用于迭代的浮点数组很大时,就没有任何基本意义。对于我来说,这很常见。

numpy中是否存在提供arange()生成器版本的函数,还是我需要手工对其进行编码?

1 个答案:

答案 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