Numpy dtype=int

6
在下面的代码中,我得到了x1的预期结果。
import numpy as np 
x1 = np.arange(0.5, 10.4, 0.8)
print(x1)
[ 0.5  1.3  2.1  2.9  3.7  4.5  5.3  6.1  6.9  7.7  8.5  9.3 10.1]

但是在下面的代码中,当我设置dtype=int时,为什么x2的结果不是[ 0 1 2 2 3 4 5 6 6 7 8 9 10],而是得到x2的值为[ 0 1 2 3 4 5 6 7 8 9 10 11 12],其中最后一个值12超过了10.4的结束值。请解释一下我的概念。
import numpy as np 
x2 = np.arange(0.5, 10.4, 0.8, dtype=int)
print(x2)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12]
1个回答

5
根据文档:https://docs.scipy.org/doc/numpy1.15.0/reference/generated/numpy.arange.html

stop: 数字 区间的终点。该区间不包括这个值,但在某些情况下,如果步长不是整数,并且浮点舍入影响了输出长度,则会包括这个值。

arange: ndarray 均匀间隔的值数组。
对于浮点参数,结果长度为ceil((stop - start)/step)。由于浮点溢出,此规则可能导致输出的最后一个元素大于stop。

因此,在这里,最后一个元素将是什么?
In [33]: np.ceil((10.4-0.5)/0.8)                                                
Out[33]: 13.0

因此,我们发现在np.arange(0.5, 10.4, 0.8, dtype=int)的情况下超出了12,因为在上述情况下stop=13,默认值为0,因此我们看到的输出结果是这样的。
In [35]: np.arange(0.5, 10.4, 0.8, dtype=int)                                   
Out[35]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

因此,生成整数范围的更好方法是使用整数参数,如下所示:
In [25]: np.arange(0, 11, 1)                                                    
Out[25]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

这个解释了overshoot。但它并没有解释为什么值不像[0 1 2 2 3 4 5 6 6 7 8 9 10 11]这样,其中一个或多个元素被重复,并且最多超出1。答案在这个文档句子中找到:“用于填充数组的实际步骤值是dtype(start + step)- dtype(start)”。在这种情况下,步幅值变成了1而不是0.8。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接