我想画出泊松分布,得到λ的负概率
此代码为不同的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)
为了计算概率,我也得到负值。我完全糊涂了。谁能解释一下效果或者我做错了什么?提前感谢。:)
您的问题是由于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。