我希望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添加到最终值的明显解决方案。但是这在我的代码中看起来很糟糕......我希望以某种方式很好地解决这个问题
答案 0 :(得分:3)
您可以指定用户应输入的值吗?对于那一代,我认为linspace
可能更好,因为它包含end
参数
编辑:如果用户输入start
,end
和increment
,如果增量的确切值不是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