2016-02-27 70 views
0

我對python相當陌生並且有一個愚蠢的問題。我查找答案,找不到它,所以我在這裏(在StackOverflow上的第一個問題,如果有任何錯誤,請原諒)。分配2D陣列函數返回值到一個新的numpy數組

我有一個完美的功能(functions.Reservoir)。它需要一個複雜的numpy 2D數組和一個浮點值作爲參數。它返回另一個複雜的numpy 2D數組。我嘗試將所有這些返回值保存在一個新的numpy數組中。 問題是第一個打印命令給了我正確的值,這意味着我的功能正常工作。但是在for循環之外,當我打印l變量時,所有元素都具有相同的值,即最後一個元素應該具有的值。

你能告訴我,我做錯了什麼?

你可以幫助我的另一件事是將這些返回值保存爲3D numpy數組。我不想使用vstack,因爲有時候我的循環會重複4000次,而vstack會大大減慢它的速度。我現在所做的就是將numpy數組保存爲對象,然後從這個迭代器中創建一個新數組。如果有更好的方法,請讓我知道。在此先感謝

k= np.zeros((400,3), dtype=np.complex128) 
    l= np.empty(noPoints1, dtype=object) 
    for i in xrange(noPoints1): 
     l[i] = functions.Reservoir(k, data[ OFFSET1+ Discard +i]) 
     print l[i] 
     k=l[i] 
    print l 

更新

這裏更多的是對我的代碼:

def determ(k1, k2, d): 
    dkdt = np.zeros_like(k1) 

    EA1 = np.absolute(k1[0])**2 
    EA2 = np.absolute(k1[1])**2 

    gain1= g1*(k1[2]-N0)/(1+s*EA1) 
    gain2= g2*(k1[2]-N0)/(1+s*EA2) 

    dkdt[0]= 0.5 * (1+ A*1j) * (gain1 - pd) * k1[0] 

    dkdt[1]= 0.5 * (1+ A*1j) * (gain2 - pd) * k1[1] 

    dkdt[2]= Stroom/e - k1[2]*ed - EA1*gain1 - EA2*gain2 
    return dkdt 

def Reservoir(y,d): 
    q= y.shape[0]    
    mdata= 0.5*np.pi*d*maskvector #Maskvector 1D with q elements 

    for n in xrange(q): 
     yn = y[n,:]    # Predictor 

     if n+1<q: 
     ytd= y[n+1,:]   # Predictor Delayed Field strength 
     else: 
     ytd= y[n+1-q,:] 
     #See y as the state of a circular reservoir. If you reach the end at q, then it directly connects back at the start. 

     fn = determ(k1=yn, k2=ytd, d=mdata[n]) 

     ybar = yn + fn*step   # Corrector 
     if n+2<q: 
     ytdbar= y[n+2,:]   # Corrector Delayed Field strength 
     else: 
     ytdbar= y[n+2-q,:] 

     fnbar = determ(k1= ybar, k2=ytdbar, d=mdata[n]) 

     if n+1<q: 
     y[n+1] = yn + 0.5*(fn + fnbar)*step 
     else: 
     y[n+1-q] = yn + 0.5*(fn + fnbar)*step 
    return (y) 

PS。我試過HYRY(Collecting results from a loop that returns NumPy Arrays)的答案,但是我仍然得到了所有元素的相同值。

+0

歡迎。只是給你更多的代碼(水庫?),這有點難以理解。許多numpy函數返回數組的視圖而不是數組的副本,這可能是這裏的問題。 –

回答

0

看來你總是在同一個陣列上工作。在k=l[i].copy()更改將確保在每個步驟的新陣列上工作。

Reservoirreturn y一點兒也不在 docs創建一個新的數組作爲explaine:

注意陣列片不要複製內部數組數據,而且還產生了原始數據的新觀點,

+0

工作就像一個魅力..非常感謝您抽出寶貴的時間去通過該代碼。現在我差不多已經有兩天了。 – krishan