无法理解np.arange中命令的输出


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]

最新更新