python - 关于python计算不一致的好奇问题
问题描述
我正在尝试使用 Python 学习泊松分布。我想使用列表理解生成一个概率列表。保证公式不会返回负数。但是,当我在下面的列表理解中使用时,我得到了很多负数。
请您向我解释一下导致问题的原因。有关详细信息,请参阅下面的行。
谢谢你们。
import math
import numpy as np
lam = 15
a = np.arange(30)
b = [np.exp(-lam)*(lam**x)/math.factorial(x) for x in a]
[3.059023205018258e-07,
4.588534807527386e-06,
3.44140110564554e-05,
0.000172070055282277,
0.0006452627073085387,
0.0019357881219256162,
0.0048394703048140406,
0.010370293510315801,
-0.013141028594890315,
-0.0001781617069955619,
9.481664980368431e-05,
-2.362463102985818e-06,
-2.1020607345176417e-07,
-3.1555253576611854e-08,
-3.6677408619686507e-09,
3.5112039118960344e-10,
1.520183133726461e-11,
-1.3618446037306896e-12,
9.639826317732186e-14,
4.996694908364656e-16,
-1.6527804252450604e-16,
1.052286501865168e-17,
1.6130198477088384e-19,
3.5537768829770886e-21,
1.0354451630381044e-22,
-2.257593163998853e-23,
6.599657279663544e-27,
3.666476266479747e-27,
1.9641837141855786e-27,
-2.4206987189043917e-29]
解决方案
的元素np.arange(30)
是numpy.int64
s,可以溢出负数:
>>> a = np.arange(30)
>>> 15**a[19]
-4608176067875183057
对于列表理解,您根本不需要 NumPy:
lam = 15
a = range(30)
b = [math.exp(-lam)*(lam**x)/math.factorial(x) for x in a]
推荐阅读
- c# - 包含对象列表的对象的 ASP.NET Core 3.0 MVC CRUD
- r - 带有图案填充的ggplot2 geom_point
- generics - 如何在 UML 中表示模板函数的类型约束
- database - 生成 UID 的方法
- python - vscode交互式窗口jupyter不会通过多行
- spring-batch - 如何在不同的作业配置上实现一定程度的抽象?
- python - 张量流2中单个矩阵的按位运算
- php - PHP Chilkat imap 组件内存泄漏
- eclipse - 在 Eclipse 中保存文件时是否可以自动运行 Junit 测试?
- flutter - 检测何时在 Flutter 中加载布局