Python运行时警告:在true_divide返回n/db/n.sum()中遇到无效值,bin_

2024-04-26 07:59:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是生成一个具有期望均值和σ的随机二维正态分布,并能够用麦克斯韦分布拟合它。我在StackOverflow中修改了一个code,但是我一直在标题中得到错误。我尝试过使用垃圾箱大小,但很明显,如果垃圾箱不是从0开始,它会不断给我错误:

from scipy.stats import maxwell
import math
import random
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import matplotlib.ticker as ticker     


def maxw(size = None):
    """Generates size samples of maxwell"""
    mu, sigma = 307, 16
    vx = np.random.normal(mu, sigma, size=size)
    vy = np.random.normal(mu, sigma, size=size)
    vz = np.random.normal(mu, sigma, size=size)
    return np.sqrt(vx*vx + vy*vy + vz*vz)

mdata = maxw(100000)
h, bins = np.histogram(mdata, bins = 101, range=(290.0, 320.0))
x = np.linspace(290.0, 320.0, 100)
rv = maxwell()

fig, ax = plt.subplots(1, 1)

ax.hist(mdata, bins = bins, density=True, color='blue', alpha=0.7, histtype='bar', ec='black')
ax.plot(x, rv.pdf(x), 'k-', lw=2, label='Maxwell pdf')
plt.title("Maxwell")
plt.show()

有什么建议吗


Tags: importsizeasnppltrandomsigmanormal
1条回答
网友
1楼 · 发布于 2024-04-26 07:59:43

这是因为在没有数据的区域生成直方图:

线路

>>> h, bins = np.histogram(mdata, bins = 101, range=(290.0, 320.0))

返回一个全为零的直方图数组:

>>> h
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

这是因为分布的正交和(函数的输出)的平均值不是和中每个分布的平均值。它是平均值的正交和(即np.sqrt(3*307^2) ~ 530),因此您制作了一个零值直方图

您可以通过更改np.histogram函数的范围来解决此问题,或者干脆完全删除该范围,然后将x数组更改为

>>> x = np.linspace(min(mdata), max(mdata), 100)

或者,您可以让matplotlib自己的直方图函数处理所有问题:

>>> plt.hist(mdata, bins=100)

相关问题 更多 >