0

リストからデータを読み込み、フーリエ変換して、プロットする前にシフトするプログラムを書いています。これまでのところ、コードは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

誰かがこれらの問題を回避するために私のコードを改善する方法を提案できますか?ありがとう。

4

2 に答える 2

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]の長さが1であることを意味します。fid_pts

2番目のエラー

したがって、再帰関数は内部で2つのブランチを処理する必要があります。1つは終了ブランチ(これにより、物事が無限に渦巻くのを防ぎます)であり、もう1つは、前述のスパイラルを試みるブランチです。

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()
于 2012-11-29T14:36:57.300 に答える
0

fftshitの前にデータをフーリエ変換する別のforループを追加することで解決しました。

fft_list = []
for i in range(0, frames):
    current_fid = fft(fid_list[i])
    fft_list.append(current_fid)  
于 2012-12-03T12:44:35.343 に答える