我试图生成具有较大值 * n * 的二项分布,但是如果我输入大于(2^32)/2 - 1的值,我会得到一个错误。例如,如果我运行以下命令:
from scipy.stats import binom
binom.rvs(2147483648,0.5)
我得到这个错误:
binom.rvs(2147483648, .5)
Traceback (most recent call last):
Cell In[4], line 1
binom.rvs(2147483648, .5)
File ~\Anaconda3\envs\default\lib\site-packages\scipy\stats\_distn_infrastructure.py:3357 in rvs
return super().rvs(*args, **kwargs)
File ~\Anaconda3\envs\default\lib\site-packages\scipy\stats\_distn_infrastructure.py:1048 in rvs
vals = self._rvs(*args, size=size, random_state=random_state)
File ~\Anaconda3\envs\default\lib\site-packages\scipy\stats\_discrete_distns.py:62 in _rvs
return random_state.binomial(n, p, size)
File mtrand.pyx:3385 in numpy.random.mtrand.RandomState.binomial
TypeError: Cannot cast scalar from dtype('int64') to dtype('int32') according to the rule 'safe'
我在Windows 10中使用python作为Anaconda安装的一部分。python版本是3.9.16 64位,scipy版本是1.10.0。
我试着诊断问题的一些方面:
在一个在线解释器中运行相同的代码。我在w3 schools网站上运行它,它没有给出错误。scipy版本是1.4.1。我用相同版本的scipy在我的PC上创建了一个Anaconda环境,它 * 仍然 * 给出错误。
检查了其他离散随机数分布。scipy. stats. boltzmann似乎没有这个限制。scipy. stats. poisson确实在我尝试poisson. rvs(lam)时抛出了错误"lam值太大",其中lam大于2147013648(即小于(2^32)/2 - 1)。看起来像是一个类似的错误,但不一样。
这可能是二项式函数中的一个bug吗?事实上它在w3 schools网站上运行良好,这让我认为这是我的机器的配置问题,但我不知道该检查什么。
1条答案
按热度按时间67up9zun1#
n
对于np.random.binomial
来说太大:该数字,作为数组为
int64
:相同的数字,但是作为python int,会产生一个相关的错误:
这没有文档记录,但显然
c
代码(或cython
)需要long/int32
作为n
参数。这是一个相当新的
numpy
(1.23.5)较大的值适用于较新的随机数生成器:
此随机数发生器可提供给
binom.rvs
: