2017-08-19 41 views
1

我得到了python2.7 numpy的阵列非常有线检测。请看这个代码。numpy的阵列乘10得到错误的结果

import numpy as np 
times = np.arange(5., 85, 0.1) 
print times 
times = np.array(times * 10, dtype=np.int) 
print times 

原来times应该[5.0 ~ 84.9]。乘10后,它应该成为[50 ~ 849],但结果是这样的:

[ 50 51 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 ... ]
有之间50

+0

这基本上是一个浮点问题。 '(times * 10)[2]'是'51.999999999999993'。如果你把它当作int来处理,它会返回51,而不是52. – ayhan

回答

3

的问题是,你的第三个项目是不完全52.051.999999999999993(见Is floating point math broken?)。截断该值因此导致51

正确的方法将是第一轮的值。 (如Safest way to convert float to integer in python?所有足够小的整数指出,可以精确地表示为浮动。)因此,你必须计算:times = np.array(np.round(times * 10), dtype=np.int)

+0

非常感谢!我认为乘以10,我们可以使用+ 0.5,但如何乘以一个变量,而不是10? 我想,以确保计算结果不能在附近的号码相同的,如果原始数组不一样。 – sccds

+0

增加0.5适用于所有的正数,因为它“转换”截断的舍入操作。例如0.999得到1.499,将结果截断为1.然而,如果使用'np.round'(正如我更新的答案中)那样性能的小幅下降没有问题,那么最好的选择是(也适用于负数)。 – Stephan