创建规则排列的数字序列

时间:2018-09-23 22:43:56

标签: python numpy

我创建了一个规则排列的数字序列,这些天真可以通过以下简单代码定义:

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)

这种方法是否不合格?

1 个答案:

答案 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线程以了解更多信息。

还要注意,我说过您应该有固定数量的步骤。如果您尝试基于startstop计算步骤数,则会遇到类似的问题,就像在其他answer上看到的一样。