从“当我以为我开始唠唠叨叨的唠叨”文件......
>>> import numpy as np
>>> y = np.array((1650, 2300, 2560, 3710)) * 1000000
>>> y
array([ 1650000000, -1994967296, -1734967296, -584967296])
我的老数学教练会同意第一个结果,但其他人
FWIW,在64位Win 10上运行Python 3.6.3,也得到(正如预期的那样)
>>> 2300 * 1000000
2300000000
答案 0 :(得分:3)
这是因为整数的最大值为2 ^ 31 - 1 = 2147483647.
您的第一个值小于此值,但其他3个值更大。因此,你得到“循环”。请注意:
-1994967296 = -2147483648 + (2300000000 - 2147483647 - 1)
所以基本上你已经达到最大值(2147483647)加1以达到最低值(-2147483648)然后从那里继续。
你可以通过强制64位精度来解决这个问题
>>> import numpy as np
>>> y = np.array((1650, 2300, 2560, 3710), dtype='int64') * 1000000
>>> y
array([1650000000, 2300000000, 2560000000, 3710000000], dtype=int64)
答案 1 :(得分:2)
您的问题是由32位整数溢出引起的。如果要处理所有大整数,请使用dtype=np.object
。当然会有一些性能损失:
y = np.array((1650, 2300, 2560, 3710),dtype=np.object) * 10000000000000
答案 2 :(得分:1)
您的值正在循环,因为它们大于最大值。
您可以使用int64获得更多范围(也将使用更多内存):
y = np.array((1650, 2300, 2560, 3710), dtype=np.int64)
查看所有可用类型here。