当前位置: 首页 > 知识库问答 >
问题:

Numpy幂返回负值

阴高寒
2023-03-14

我想画出泊松分布,得到λ的负概率

此代码为不同的lambda生成绘图:

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import factorial

for lambda_val in range(1, 12, 2):

    plt.figure()
    
    k = np.arange(0,20)
    y = np.power(lambda_val, k)*np.exp(-lambda_val)/factorial(k)

    plt.bar(k, y)
    plt.title('lambda = ' + str(lambda_val))
    plt.xlabel('k')
    plt.ylabel('probability')
    plt.ylim([-0.1, 0.4])
    plt.grid()
    plt.show()

请看这两幅图:

在我看来,Lambda=5看起来不错。

λ=9,不适用。

我很确定这和np.power有关因为

np.power(11, 9)

给我:-1937019605,而

11**9

给我:2357947691(WolframAlpha也一样)。

但是如果我避免np。权力与使用

y = (lambda_val**k)*math.exp(-lambda_val)/factorial(k)

为了计算概率,我也得到负值。我完全糊涂了。谁能解释一下效果或者我做错了什么?提前感谢。:)

共有1个答案

乔鸿骞
2023-03-14

您的问题是由于32位整数溢出造成的。发生这种情况是因为Numpy有时编译为32位整数,即使平台(操作系统处理器)是64位的。存在溢出,因为Numpy自动将Python解释器的无界整数转换为本机np.int_类型。您可以使用检查此类型是否为64位类型np.int_np.int64。AFAIK,Python Pip上为Windows编译的默认Numpy二进制包使用32位整数,Linux包使用64位整数(假设您在64位平台上)。

该问题可以通过以下方式轻松复制:

In [546]: np.power(np.int32(11), np.int32(9))
Out[546]: -1937019605

它也可以解决使用:

In [547]: np.power(np.int64(11), np.int64(9))
Out[547]: 2357947691

在第二个表达式中,使用类型为np的k。默认情况下,这就是为什么会出现相同问题的原因。希望您可以向Numpy指定整数应该更大。请注意,Numpy有一些隐式规则来避免溢出,但在所有情况下都很难避免它们,而不会严重影响性能。这里有一个固定的公式:

k = np.arange(0, 20, dtype=np.int64)
y = np.power(lambda_val, k) * np.exp(-lambda_val) / factorial(k)

经验法则是在得到意外结果时要非常小心隐式转换。

 类似资料:
  • 问题内容: 我想生成对称的零对角矩阵。我的对称零件正常工作,但是当我从numpy使用fill_diagonal作为结果时,结果为“无”。我的代码如下。感谢您的阅读 问题答案: 与跨python / numpy的许多其他方法一样,它可以就地工作。例如:为什么“ return list.sort()”返回None,而不返回列表? 。那是因为它直接更改了内存中的对象,而不创建新对象。这些函数的返回值为。

  • 问题内容: 这是我的代码: 我在Java文档中查看了此内容,长度为负数,原因如下: “内容的字节数,如果未知,则为负数。如果内容> length是已知的但超过Long.MAX_VALUE,则返回负数。” 这可能是什么原因?我正在尝试下载图像。我想指出的是,这是我尝试下载图像的第四个方法。这里提到了其他三个。 编辑: 根据要求,这是我正在使用的完整方法。 问题答案: 简单的答案是内容长度未知。更具体

  • 问题内容: 起初我想注意到英语不是我的母语,无论我希望我们不会误会 我在Android上编写了简单的应用程序,发现了一个问题,也解决了该问题,但是无论如何,我都想了解为什么会这样。 我创建了一个sql表: 并以这种方式将数据放入其中: 现在..一切正常,我使用此应用程序进行了验证,可以存储的值正确。 不过,当我尝试使用1得到错误的值2)获得日期值时,它的负数(例如-1004124) 因此,我尝试用

  • 为什么numeric_limits::min返回一个负值为int,但正值为例如浮动和双? 输出: 参考文献: 返回可由数字类型T表示的最小有限值。 对于具有反规范化的浮点类型,min返回最小的正规范化值。请注意,这种行为可能是意外的,特别是与整型类型的min行为相比。要查找没有值小于它的值,请使用。 min仅对有界类型和无界无符号类型有意义,也就是说,表示无穷多个负值的类型没有意义的最小值。

  • 问题内容: 我想在路径中找到匹配的字符串,并使用np.select创建一个新列,其中的标签取决于我找到的匹配项。 这是我写的 但是,当我运行此代码时,出现以下错误消息: ValueError:condlist中的无效条目0:应为boolean ndarray 这是我的数据样本 问题答案: 该方法在对象列上操作。此类列中可能包含非字符串值,结果是这些行而不是返回。然后抱怨,因为这不是布尔值。 幸运的

  • 问题内容: 当我在终端尝试这个 我收到以下错误 但是,我可以分两个步骤执行此操作,例如, 为什么会有这种行为?用单行解决此问题的方法是什么? 问题答案: 提高功率优先于一元减号。 因此,您拥有的却不是您所期望的: 如果您希望它起作用,您应该写 或按照@TimPietzcker的说明切换Python 3。