使用numpy到平方值会给出负数

时间:2017-01-20 23:33:37

标签: python numpy

我正在尝试将numpy用于元素方形数组。我注意到有些值显示为负数。平方值不接近max int limit。有谁知道为什么会发生这种情况以及如何解决这个问题?我宁愿避免使用for循环来对数组元素进行平方,因为我的数据集非常大。

以下是正在发生的事情的一个例子:

import numpy as np

test = [1, 2, 47852]
sq = np.array(test)**2
print(sq)
print(47852*47852)

输出:

[1,4, -2005153392]
2289813904

2 个答案:

答案 0 :(得分:15)

这是因为NumPy不会检查整数溢出 - 可能是因为这会降低每个整数运算的速度,并且NumPy在设计时考虑了效率。因此,当你有一个32位整数数组并且你的结果不适合32位时,它仍然被解释为32位整数,给你奇怪的负面结果。

为了避免这种情况,您可以注意安全执行操作所需的dtype,在这种情况下'int64'就足够了。

>>> np.array(test, dtype='int64')**2
2289813904

您没有看到Python int的相同问题,因为Python检查溢出并在必要时相应地调整为更大的数据类型。如果我记得,在邮件列表上有一个关于这个的问题,并且响应是如果在NumPy中完成相同的操作,原子数组操作会有很大的性能影响。

至于为什么您的默认整数类型在64位系统上可能是32位,在相关问题上为Goyo answered,默认整数np.int_类型{ {3}},它取决于平台,但可以是32位。

答案 1 :(得分:0)

实际上,代码的结果是:

[1, 4, 2289813904]

但是对于平方负数的情况,您需要将负数放在括号中:

>>> (-10) ** 2