使用fff_shift时递归问题

时间:2012-11-29 14:24:32

标签: python numpy scipy

我正在编写一个程序来读取列表中的数据,傅里叶变换并在绘图之前将其移位。到目前为止,代码从DICOM文件中获取光谱数据并将其放入列表中,每个元素都包含一个包含每个FID /光谱值的数组。

from pylab import *
import dicom

plan=dicom.read_file("")

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

fid_list = []
for fidN in arange(frames):
    offset = fidN * fid_pts 
    current_fid = cmplx_data[offset:offset+fid_pts]
    fid_list.append(current_fid)

这适用于对数据进行分组,但在尝试使用生成的数组时遇到问题。首先,当试图仅显示数据的复杂部分时,例如:

plot(complex(fid_list[0]))

返回

Traceback (most recent call last)
/home/dominicc/Desktop/<ipython-input-37-4146b7fbfd7c> in <module>()
----> 1 plot(complex(fid_list[0]))

TypeError: only length-1 arrays can be converted to Python scalars

其次,最重要的是,在尝试绘制FFT数据的零频移时,我会遇到无限递归:

plot(fftshift(fft(fid_list[0])))

获得以下错误

/home/dominicc/Desktop/New_Script.py in fftshift(fid_in)
     23 
     24 def fftshift(fid_in):
---> 25         fft_fid_in = fft(fid_in)
     26         plot(fftshift(fft_fid_in))
     27         show()

/usr/lib/python2.7/dist-packages/numpy/fft/fftpack.pyc in fft(a, n, axis)
    162     """
    163 
--> 164     return _raw_fft(a, n, axis, fftpack.cffti, fftpack.cfftf, _fft_cache)
    165 
    166 

/usr/lib/python2.7/dist-packages/numpy/fft/fftpack.pyc in _raw_fft(a, n, axis, init_function, work_function, fft_cache)
     43 def _raw_fft(a, n=None, axis=-1, init_function=fftpack.cffti,
     44              work_function=fftpack.cfftf, fft_cache = _fft_cache ):
---> 45     a = asarray(a)
     46 
     47     if n is None:

RuntimeError: maximum recursion depth exceeded

有人可以提出改进我的代码的方法,以避免这些问题吗?感谢。

2 个答案:

答案 0 :(得分:1)

第一个错误

在你的for循环中你有:

current_fid = cmplx_data[offset:offset+fid_pts]
fid_list.append(current_fid)
因此,fid是一个多维列表。情况就是这样,因为[foo,bar].append([some,list])会产生[foo,bar,[some,list]]

complex(fid_list[0])期望任何列表的长度为1.行current_fid = cmplx_data[offset:offset+fid_pts]表示fid_list [0]的长度为fid_pts

第二次错误

因此递归函数需要在内部处理两个分支。一个是终止分支(这可以阻止事物从螺旋状变为无穷大),而另一个分支是尝试前面提到的螺旋状分支。

fftshift不会处理终止分支,因此您需要为此添加一些代码。

重写这样的功能并运行它以查看这一点:

def fftshift(fid_in):
    print('fftshift 1')
    fft_fid_in = fft(fid_in)
    print('fftshift 2')
    foo = fftshift(fft_fid_in)
    print(' fftshift3')

这将打印:

fftshift 1
fftshift 2
fftshift 1
fftshift 2
fftshift 1
fftshift 2
etc etc recursion error

最简单的递归函数形式是:

def my_recursive_fn(foo):
    if some_condition:   #the terminating condition
        return bar #this should NOT call my_recursive_fn in any way
    moo = do_processing(foo)
    return my_recursive_fn(foo)


    plot(foo)
    show()

答案 1 :(得分:0)

解决方法是添加另一个for循环,傅立叶在fftshit之前转换数据:

fft_list = []
for i in range(0, frames):
    current_fid = fft(fid_list[i])
    fft_list.append(current_fid)