“参数必须是可调用函数”当使用scipy.integrate.quad
问题描述:
我写了一些代码,使我能够从DICOM文件中获取数据并将数据分离为单独的FID信号。“参数必须是可调用函数”当使用scipy.integrate.quad
from pylab import *
import dicom
import numpy as np
import scipy as sp
plan=dicom.read_file("1.3.46.670589.11.38085.5.22.3.1.4792.2013050818105496124")
all_points = array(plan.SpectroscopyData)
cmplx_data = all_points[0::2] -1j*all_points[1::2]
frames = int(plan.NumberOfFrames)
fid_pts = len(cmplx_data)/frames
del_t = plan.AcquisitionDuration/(frames * fid_pts)
fid_list = []
for fidN in arange(frames):
offset = fidN * fid_pts
current_fid = cmplx_data[offset:offset+fid_pts]
fid_list.append(current_fid)
我现在想确定一些这个数据的话,应用傅里叶变换和移位我试着使用SciPy的的四功能,遇到了以下错误后:
spec = fftshift(fft(fid_list[0])))
sp.integrate.quad(spec, 660.0, 700.0)
error Traceback (most recent call last)
/home/dominicc/Experiments/In Vitro/Glu, Cr/Phantom 1: 10mM Cr, 5mM Glu/WIP_SV_PRESS_ME_128TEs_5ms_spacing_1828/<ipython-input-107-17cb50e45927> in <module>()
----> 1 sp.integrate.quad(fid, 660.0, 700.0)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
243 if type(args) != type(()): args = (args,)
244 if (weight is None):
--> 245 retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
246 else:
247 retval = _quad_weight(func,a,b,args,full_output,epsabs,epsrel,limlst,limit,maxp1,weight,wvar,wopts)
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.pyc in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
307 if points is None:
308 if infbounds == 0:
--> 309 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
310 else:
311 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
error: First argument must be a callable function.
莫非
有人请建议一种方法来使这个对象可调用?阅读What is a "callable" in Python?后,我还是不太清楚。读完后,我试了
def fid():
spec = fftshift(fft(fid_list[0]))
return spec
哪个返回了相同的错误。
任何帮助将不胜感激,谢谢。
答
由于您正在整合仅在网格上定义的函数(即数字数组),因此您需要使用“Integration, given fixed samples”中的一个例程。
事实上,第一个参数quad()
must be a function,你可以调用(“可调用”)的东西。举例来说,你可以这样做:
>>> from scipy.integrate import quad
>>> def f(x):
... return x**2
...
>>> quad(f, 0, 1)
(0.33333333333333337, 3.700743415417189e-15)
这是可以做到的,而不是抽样f()
:
>>> from scipy.integrate import simps
>>> x_grid = numpy.linspace(0, 1, 101) # 101 numbers between 0 and 1
>>> simps(x_grid**2, dx=x_grid[1]-x_grid[0]) # x_grid**2 is an *array*. dx=0.01 between x_grid values
0.33333333333333337
你的情况就像是在第二个例子:你整合采样功能,因此很自然地使用一个或cumtrapz()
,simps()
或romb()
。
它不应该是一个需要参数的函数吗?还有什么可以整合? – 2013-05-09 13:42:45
这个问题没有意义。你不能使用'scipy.integrate.quad'集成一个数组。它集成了一个*函数*,它接受一个参数(例如'sin(x)')。使用类似'scipy.integrate.simps'的东西来集成一组函数值。 – talonmies 2013-05-09 13:44:11