python scipy.stats.binom错误“无法根据规则'safe'将标量从数据类型('int64 ')强制转换为数据类型('int32')”

wbgh16ku  于 2023-03-08  发布在  Python
关注(0)|答案(1)|浏览(185)

我试图生成具有较大值 * 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网站上运行良好,这让我认为这是我的机器的配置问题,但我不知道该检查什么。

67up9zun

67up9zun1#

n对于np.random.binomial来说太大:

In [65]: np.random.binomial(np.array(2147483648),.5)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[65], line 1
----> 1 np.random.binomial(np.array(2147483648),.5)
        np.random = <module 'numpy.random' from 'C:\\Users\\paul\\miniconda3\\lib\\site-packages\\numpy\\random\\__init__.py'>
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'

该数字,作为数组为int64

In [66]: np.array(2147483648)
Out[66]: array(2147483648, dtype=int64)

相同的数字,但是作为python int,会产生一个相关的错误:

In [67]: np.random.binomial(2147483648,.5)
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
Cell In[67], line 1
----> 1 np.random.binomial(2147483648,.5)
        np.random = <module 'numpy.random' from 'C:\\Users\\paul\\miniconda3\\lib\\site-packages\\numpy\\random\\__init__.py'>
File mtrand.pyx:3385, in numpy.random.mtrand.RandomState.binomial()    
OverflowError: Python int too large to convert to C long

这没有文档记录,但显然c代码(或cython)需要long/int32作为n参数。
这是一个相当新的numpy(1.23.5)
较大的值适用于较新的随机数生成器:

In [78]: rng=np.random.default_rng()
In [79]: rng.binomial(21474836489,.5)
Out[79]: 10737383445

此随机数发生器可提供给binom.rvs

In [85]: binom.rvs(2147483648, .5, random_state=rng)
Out[85]: 1073724721

相关问题