python-3.x - scipy.integrate 错误:只有大小为 1 的数组可以转换为 Python 标量
问题描述
我试图通过改变标准偏差(std)来计算高斯分布的概率。我期望通过使用具有 21 个点的高斯正交,在从 -1 到 +1 的范围内积分,均值 = 0 并设置 std= 1 和 std = 2 将分别产生 p = 0.68 和 p = 0.95(附图)。
import scipy.integrate as integrate
import math as m
#mean=0
#varying the sigma
def f(sigma,x):
return m.exp(-1*(x**2)/(2*sigma**2))/(sigma*m.sqrt(2*m.pi))
def prob_at_nsigma(sigma):
value = 0.
ans,anserr =integrate.quadrature(f,-1,1,args=(sigma ,),maxiter=21)
value = ans
return value
print(prob_at_nsigma(1))
我得到以下错误,我不明白为什么会出现“除以零”和“只有 size-1 数组可以转换为 Python 标量”:
runfile('C:/pythonExe/ntu_cp/untitled0.py', wdir='C:/pythonExe/ntu_cp')
C:\pythonExe\ntu_cp\untitled0.py:14: RuntimeWarning: divide by zero encountered in true_divide
return m.exp(-1*(x**2)/(2*sigma**2))/(sigma*m.sqrt(2*m.pi))
C:\pythonExe\ntu_cp\untitled0.py:14: RuntimeWarning: invalid value encountered in true_divide
return m.exp(-1*(x**2)/(2*sigma**2))/(sigma*m.sqrt(2*m.pi))
Traceback (most recent call last):
File "C:\pythonExe\ntu_cp\untitled0.py", line 23, in <module>
print(prob_at_nsigma(1))
File "C:\pythonExe\ntu_cp\untitled0.py", line 19, in prob_at_nsigma
ans,anserr =integrate.quadrature(f,-1,1,args=(sigma ,),maxiter=21)
File "C:\Users\cztee\anaconda3\lib\site-packages\scipy\integrate\_quadrature.py", line 238, in quadrature
newval = fixed_quad(vfunc, a, b, (), n)[0]
File "C:\Users\cztee\anaconda3\lib\site-packages\scipy\integrate\_quadrature.py", line 119, in fixed_quad
return (b-a)/2.0 * np.sum(w*func(y, *args), axis=-1), None
File "C:\Users\cztee\anaconda3\lib\site-packages\scipy\integrate\_quadrature.py", line 149, in vfunc
return func(x, *args)
File "C:\pythonExe\ntu_cp\untitled0.py", line 14, in f
return m.exp(-1*(x**2)/(2*sigma**2))/(sigma*m.sqrt(2*m.pi))
TypeError: only size-1 arrays can be converted to Python scalars
感谢任何帮助。谢谢!
解决方案
您的代码中有两个问题:
- 如前所述,您应该使用
numpy
而不是math
模块。 - 你的
f
函数的参数顺序是错误的。Scipy 假设第一个变量x
后面跟着其他参数。所以应该是f(x, sigma)
,不是f(sigma, x)
。
解决方案:
import numpy as np
import scipy.integrate as integrate
def f(x, sigma):
return np.exp(-1*(x**2)/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))
def prob_at_nsigma(sigma):
value = 0.
ans, anserr = integrate.quadrature(f, -1, 1, args=(sigma,), maxiter=21)
return ans
print(prob_at_nsigma(1))
# 0.6826894922280757
推荐阅读
- html - 应用 CSS 过渡时,div 元素从 html 正文顶部向下滑动
- caching - 使用只读副本时,分布式 LRU 缓存如何正确驱逐条目
- c# - System.webserver 具有无效的子元素“cors”
- ios - Trouble Selecting Table View Rows
- c++ - C++ Function Calling with Parameter in int main
- algorithm - 为以下示例计算大“O”
- ios - Obj-C - 所有自定义 MKMapView 注释并不总是显示在 MapView 上?
- vb.net - 从列表中移动一个项目并将其从前一个列表中删除
- python - Python舍入问题需要将每个数字舍入一半
- sql - 从标准输入 PostgreSQL 复制