【问题标题】:Using numpy to square value gives negative number使用 numpy 平方值给出负数
【发布时间】:2017-06-06 01:20:48
【问题描述】:

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

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

import numpy as np

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

输出:

[1,4, -2005153392]
2289813904

【问题讨论】:

  • 这很奇怪;当我输入代码时,我得到了正确的答案。您是否尝试过使用 numpy 的 square 函数? sq = np.square(np.array(test)) 问题仍然存在吗?
  • 这种情况很少见,我没遇到过问题:[1 4 2289813904] 2289813904
  • 更奇怪;这两种方法都适用于我的笔记本电脑,但两种方法在我的 Raspberry Pi 上都失败了(我得到的结果与你在 Pi 上的结果相同)。
  • 你的电脑是什么架构的?,32位还是64位
  • @Mitch 下面的回答是正确的。奇怪的是,我的笔记本电脑(可以工作)和 Pi(不工作)都使用 64 位处理器;笔记本电脑是 x86,pi 使用 ARM Cortex-A53。我不会担心 64 位内核上的溢出错误——很高兴看到这篇文章。

标签: python numpy


【解决方案1】:

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

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

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

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

至于为什么您的默认整数类型在 64 位系统上可能是 32 位,就像在相关问题上的 Goyo answered 一样,默认整数 np.int_ 类型 is the same as C long,即取决于平台,但可以是 32 位。

【讨论】:

  • 您的答案如何扩展到浮点数?如果我这样做-6.19318182**2,我会得到-38.35550
  • @DexterMorgan 你期待什么?如果你按照你写的字面意思这样做,这是有道理的 - BEDMAS :)
  • 哈哈 - 我显然有数学情绪,而不是编程情绪......这对我来说显然只是一个负 6 ;)感谢您指出!
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2012-08-27
  • 2012-03-04
  • 2014-12-27
  • 2016-12-29
  • 2015-11-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多