将数组乘以标量的意外结果

时间:2018-02-13 16:48:48

标签: python numpy multidimensional-array

从“当我以为我开始唠唠叨叨的唠叨”文件......

>>> 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

3 个答案:

答案 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