我创建了一个规则排列的数字序列,这些天真可以通过以下简单代码定义:
l=6 # Number of elements
h=1 # Spatial regular interval
v=[-h/2] # First element
for i in range(l,start=1):
v.append(v[-1]+h)
我为此使用np.arange
,
np.arange(-h/2, h*(l-.5), h)
但是文档说应该使用np.linspace
,因为我没有使用整数。
np.linspace(-h/2, h*(l-.5), l, endpoint=False)
这种方法是否不合格?
答案 0 :(得分:1)
np.arange
的工作方式是将step
添加到start
并比较结果是否为>= stop
,在这种情况下它将不会生成最后一个值(端点),否则重复操作。
问题在于,由于浮点数在内存中的表示方式,永远无法将它们进行相等比较。以这个例子为例:
>>> 0.5 + 0.1 + 0.1 + 0.1 < 0.8
True
浮点数的行为可能导致将step=0.1
添加到np.arange
的先前生成的0.7
值中,并小于stop=0.8
。这就是为什么arange有时似乎返回端点的原因。它并不是真正的返回端点,它返回的是一个接近端点的数字,例如0.7999999999999999
,该数字通过返回浮点数的字符串表示形式的方法进行舍入。
在您使用固定步数时,np.linspace
并非如此,因为您不会比较浮点数,而是会计算设定的步数值。因此,回答您的问题,是的,可以安全地使用np.linspace
。检查此github线程以了解更多信息。
还要注意,我说过您应该有固定数量的步骤。如果您尝试基于start
和stop
计算步骤数,则会遇到类似的问题,就像在其他answer上看到的一样。