i=np.arange(0,2.1,0.5,dtype='int8')
print(i)
[0 0 0 0 0]
g=np.arange(0.5,2.1,0.5,dtype='int8')
print(g)
[0 1 2 3]
n=np.arange(257,260,0.5,dtype='int16')
print(n)
[257 257 257 257 257 257]
p=np.arange(257,260,0.5,dtype='int8')
print(p)
[1 1 1 1 1 1]
o=np.arange(257.5,260,0.5,dtype='int16')
print(o)
[257 258 259 260 261]
q=np.arange(257.5,260,0.5,dtype='int8')
print(q)
[1 2 3 4 5]
np.arange
是编译后的代码。除非我们能找到并研究C源代码,否则我们不知道它到底在做什么。像你这样的测试只能让我们检验假设。
如预期,首先是浮动情况:
In [124]: np.arange(0,2.1,0.5)
Out[124]: array([0. , 0.5, 1. , 1.5, 2. ])
并在之后将这些浮点转换为int
In [125]: np.arange(0,2.1,0.5).astype('int')
Out[125]: array([0, 0, 1, 1, 2])
有时这会产生意外的值,例如,如果1.0真的是0.99999。
当在arange
:中设置数据类型时会发生什么并不明显
In [126]: np.arange(0,2.1,0.5, int)
Out[126]: array([0, 0, 0, 0, 0])
这几乎就像值的数量是像浮点一样设置的,对int的截断是迭代发生的。
0, 0+.5=>.5=>0, 0+.5=>0, etc
开始时间:5:
In [127]: np.arange(0.5,2.1,0.5)
Out[127]: array([0.5, 1. , 1.5, 2. ])
In [128]: np.arange(0.5,2.1,0.5).astype(int)
Out[128]: array([0, 1, 1, 2])
In [129]: np.arange(0.5,2.1,0.5,int)
Out[129]: array([0, 1, 2, 3])
0.5 =>0; .5+.5=>1; bit 1+.5=? nope that doesn't work.
因此,浮点步骤不仅会产生较小的浮点精度差异,而且如果您加入不兼容的dtype
,整个迭代将变得不可预测。目前尚不清楚哪些值被转换为int
。很明显,它不是像astype(int)
那样简单的后截断。
来自Numpy Arange文档:
当使用非整数步长(如0.1(时,结果通常不一致。对于这些情况,最好使用numpy.linspace。
例如,由于您的第一个示例使用浮点2.1
,因此会产生意外结果。尝试使用Numpy Linspace
使用linspace作为第一个例子可能更有意义:
import numpy as np
i=np.linspace(0,2.1, num=3,dtype='int8')
print(i)
[0 1 2]
或不带dtype='t8'
[0. 1.05 2.1]