2013-01-21 171 views
2

我正在定義一個函數,它將返回一個三維網格。在此期間,我使用已定義的函數返回一個二維數組。我想在迭代過程中加入這些2-d arrarys來形成3-d,但我已經看過像meshgrid(),dstack(),concatenate()這樣的函數,但似乎無法使它們中的任何一個適合正確進入代碼。組合二維數組以形成一個三維陣列

該程序模擬二維陣列上點源波的擴散,三維陣列顯示介質的位移如何在波長的過程中變化。

def make_wave_snapshot(size,wavelength,phase): 
    waves_array = np.zeros((size,size),np.float) 
    if size%2==0: 
     for y in range(size): 
      for x in range(size): 
       r = math.hypot((size/2 - x - 0.5),(size/2 - y - 0.5)) 
       d = np.sin((2*math.pi*r/wavelength)-phase)/np.sqrt(r) 
       waves_array[y,x] = d 
     dp.display_2d_array(waves_array) #This is in another module altogether 
     return waves_array #Displays array showing values 
    else: 
     return 'Please use integer of size.' 

def make_wave_sequence(size,wavelength,nsteps): 
    waves_sequence = np.zeros((nsteps,size,size),np.float) 
     if nsteps%1==0: 
      for z in range(nsteps): 
       make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps)) 
       waves_sequence = ??? 
      return waves_sequence #Displays array showing values 
     else: 
      return 'Please use positive integer for number of steps' 

問題是將'wave_array'轉換爲'wave_sequence'。如果您編寫任何代碼,將會非常讚賞慷慨的評論。非常感謝!

+0

我想我看到你在駕駛什麼......如果我的回答(下)不是你在想什麼,可以請你在'for'循環之前和之後給你想要的'waves _sequence'的例子嗎? – Mike

回答

4

如果我理解正確的話,你有一個三維陣列,是這樣的:

wave = np.zeros((2, 2, 2), np.float) 

([[[0., 0.], 
    [0., 0.]], 
    [[0., 0.], 
    [0., 0.]]]) 

而且你要插入一個二維數組,從你的函數一樣返回:

([[ 1., 2.], 
    [ 3., 4.]]) 

這樣您的3D陣列現在是:

([[[1., 2.], 
    [3., 4.]], 
    [[0., 0.], 
    [0., 0.]]]) 

在您的的第一次迭代循環。如果這是正確的,那麼它實際上非常簡單,而且你大部分都是在那裏。您可以指定一個「要素」你的3D數組,它是一個二維數組,只要你選擇正確的條目:

for z in range(nsteps): 
    waves_sequence[z] = make_wave_snapshot(size,wavelength,(2*math.pi*z/nsteps)) 
相關問題