numpy arange for floating point start&停

时间:2016-03-31 15:35:02

标签: python-2.7 numpy floating-point

我希望numpy创建一个完整列表,给定参数start,stop和increment,但遇到了一些麻烦:

In[2]: import numpy as np
In[3]: np.arange(2.0, 2.4, 0.2)
Out[3]: array([ 2. ,  2.2])

In[4]: np.arange(2.0, 2.6, 0.2)
Out[4]: array([ 2. ,  2.2,  2.4,  2.6])

In[5]: np.arange(2.0, 2.8, 0.2)
Out[5]: array([ 2. ,  2.2,  2.4,  2.6])

我真正想要的是:

array([ 2. ,  2.2,  2.4])

现在,我已经了解到如果归结为固定值,我应该避免使用浮点数据类型。我知道将开始/停止/递增乘以100会更好,但问题是我无法判断用户将提供多少小数。有什么方法我仍然可以用Float做到这一点,还是有更好的方法来解决这个问题?

编辑: 它现在可以使用将0.0000001添加到最终值的明显解决方案。但是这在我的代码中看起来很糟糕......我希望以某种方式很好地解决这个问题

2 个答案:

答案 0 :(得分:3)

您可以指定用户应输入的值吗?对于那一代,我认为linspace可能更好,因为它包含end参数

编辑:如果用户输入startendincrement,如果增量的确切值不是linspace,则只需使用num = int((end-start)/increment+1)关键的。

EDIT2: 使1e-4适应您认为可接受的相对错误(您甚至可以将其添加为用户定义的变量)。

eps = 1e-4*(stop-start)
num = int((stop-start)/(incr-eps)+1)
np.linspace(start, stop,num)

答案 1 :(得分:0)

这可能看起来有点长,但如果你热衷于使用 np.arange,这就是我解决的方法:

decimal_places = decimal.Decimal(str(STEP)).as_tuple().exponent
power_10_multiplier = 10**-decimal_places

MIN = int(MIN*power_10_multiplier)
MAX = int(MAX*power_10_multiplier)
STEP = int(STEP*power_10_multiplier)

arr = np.arange(MIN, MAX + STEP, step=STEP)/power_10_multiplier