2016-11-28 190 views
-1

我發現fscanf有一些困難,並且在python 3.5上做了小波變換2。同樣,我想驗證劇情塊是否正確。 這裏是我的Matlab代碼:將Matlab代碼轉換爲python 3.5+

D_P=fopen('distance_profil.txt','r'); 
i=0; 
    while(feof(D_P)==0)% test for end of file 
    i=i+1; 
    sign=fscanf(D_P,'%f , '); 
    classe=fgetl(D_P); 
    %Wavelet Transform 
    [caH(i,:),cdH(i,:)] = dwt(sign,'db2');   
    %Segmentation  
    loc=[]; 
    [pks,locs] = findpeaks(abs(cdH(i,:)),'threshold',3); 
    loc=[loc,locs]; 
    mod=abs(cdH(i,:)); 
    figure 
    titre = ['distance profil : ' classe]; 

    subplot(2,1,1); plot(sign); title(titre); 
    hold on, plot(2*locs,sign(2*locs),'dr') 
    subplot(2,1,2); plot(abs(cdH(i,:))); title('Module des Details coef. for db2'); 
    hold on, plot(locs,mod(locs),'dr')  
end 

而下面是我嘗試用Python代碼

import pywt 
import numpy as np 
from scipy.signal import find_peaks_cwt 
from scipy import * 
import matplotlib.pyplot as plt 

D_P= open ("distance_profil.txt","r") 
i=0 

while True: 
    line = D_P.readline().strip() 
    if line == '': 

     def ReadFile(): 
      sign = [] 
      with open('textfiledata.txt', 'rt') as myFile: 
       for line in myFile: 
        sign.append(map(int, line.split(','))) 
      return sign 

     classe = D_P.readline().rstrip() 
     cA= np.array(sign) 
     cD= np.array(sign) 

     i+=1 

     array[cA[i,], cD[i,]] = pywt.dwt([sign, 'db2']) 

     loc = [] 
     [pks,locs] = find_peaks_cwt(abs(cdH([i,]),'threshold',3) 

     loc = [loc,locs] 
     mod=abs(cdH[i,]) 

     plt.figure() 
     plt.subplot(2,2,1) 
     plt.plot(sign,2*locs,sign(2*locs),'ro') 
     plt.title('distance profil : ' , classe) 

     plt.subplot(2,2,2) 
     plt.plot(abs(cdH(i,)),locs,mod(locs),'ro') 
     plt.title("Module des Details coef. for db2") 

     plt.show() 

    break 
+0

那麼你的嘗試呢? –

+1

我們應該如何知道您的代碼是否正確?請閱讀[問]。 –

+0

我對這個指令數組有錯誤[cA [i,],cD [i,]] = pywt.dwt([sign,'db2']) – user7220128

回答

3

這兩個問題是你的Python代碼沒有做同樣的事情,你的MATLAB代碼在很多的地方,你的Python代碼在多個地方無效。

首先,在MATLAB代碼中,此行繼續循環,直至到達文件結尾:while(feof(D_P)==0)%。你顯然正試圖用python中的這一行做同樣的事情:if line == '':。但是,只有在行空白的情況下才會運行代碼。

你可以在python中使用這種方法,但你不應該這樣做。您可以像使用for line in D_P:那樣循環播放數組。這將自動遍歷D_P的行,將每行放入變量line。此外,您應該使用with open ("distance_profil.txt","r") as D_P:來安全地打開和關閉文件,如ReadFile函數中所做的那樣。您可以使用enumerate跟蹤for i, line in enumerate(D_P):的索引。你也嘗試兩次讀取每一行,這意味着你最終會閱讀每一行。

接下來的問題是這條線cA= np.array(sign)。您不要在任何地方定義sign變量。它在ReadFile()函數中定義,您永遠不會使用它並應該刪除它。因此,而不是使用sign變量,而是使用scipy.sign函數,如果您已定義sign變量,則該函數將被覆蓋。這就是爲什麼from ___ import *是個壞主意。使用import scipy as sp或類似的東西。但是,由於您只使用單獨導入的一個scipy函數,因此您不需要該函數。

與MATLAB不同,函數是Python中的第一類對象。你可以像使用其他變量一樣使用它們。所以你正在創建一個包含一個函數的數組,而不是你顯然想要的數字數據。然而,這對於需要數字輸入的dwt函數來說是失敗的。你需要做的是將文本行轉換爲數字數組。在ReadLine中使用的方法是可以的,除了它正在讀取錯誤的文件並讀取整個文件而不是一行,您是否從某處複製該文件?但是,這不是一個很好的方法。最好使用np.fromstring(line.strip(), sep=' ')。這將把一個字符串解釋爲由空格分隔的一系列數字(用你需要的任何東西代替)並將它轉換爲一個numpy數組。這是更快,更容易。

接下來,使用dwt函數,將您分配給array[cA[i,], cD[i,]]。這不是做你想做的事情,也不會工作,因爲沒有array變量。如果array是二維numpy陣列,則這會將dwt的結果分配給對應於cAcD的索引i處的值的座標處的索引。你只是想分配到cAcD。這意味着您也可以刪除早期定義的cAcD

然後,用dwt調用,將輸入包裝在[]中。在Python中,這將列表作爲單個參數傳遞,而不是您想要的兩個參數。在MATLAB中它也不會工作,因爲它會嘗試連接一個帶有字符數組的數組(這將會失敗),並且將它作爲函數的單個輸入傳遞。那麼做pywt.dwt(sign, 'db2')

因此該行應該是:cA, cD = pywt.dwt(sign, 'db2')

此外,您使用cdH幾個地方,但從來沒有定義它。它應該是cD? MATLAB也沒有區分函數調用和數組訪問,但是python的確如此。您需要使用方括號[]和方括號才能建立索引。 cdH([i,])將被解釋爲「調用函數cdH與列表輸入[i,],這將不起作用,因爲cdH是不是一個函數(或不會如果它被定義)。尾隨逗號也是多餘的。做cdh[i]

接下來,定義loc爲空列表,然後定義locs,然後做loc = [loc, locs]。在MATLAB中,這個附加locsloc(這是多餘的,但有效的)。但在Python中,這將創建一個看起來像[[], locs],這是完全不同的,你應該把這三行減少到[pks,loc] = find_peaks_cwt(abs(cdH([i,]),'threshold',3)

另外,下面還有你寫的sign(2*locs)。正如我所說,你需要使用括號進行索引,所以這需要是sign[2*locs]

接下來,python沒有mod函數。使用%在Python中做模數。我不知道在你的MATLAB版本中有什麼mod帶有單一的參數,在我的版本中它會引發錯誤。然而,我從上下文中假設,您正在嘗試獲取小數部分,這將是locs%1

最後,你做plt.plot(abs(cdH(i,)),locs,mod(locs),'ro')。 MATLAB和Python都不知道如何繪製這樣的三個數組。您可能需要將plt.plot(abs(cdH(i,)))劃分爲它自己的plot命令,如MATLAB代碼所做的那樣,或者將np.arange(len(cdH(i,)))作爲plot的第一個參數。與其他情節一樣。總體而言,似乎你對MATLAB或Python(或兩者)都不太熟悉。在嘗試再次編寫這些代碼之前,應該仔細閱讀兩者的基礎知識。

+4

[教OP如何提出一個好問題]也是謹慎的(http://stackoverflow.com/questions/40844641 /轉換與Matlab代碼到蟒-3-5#comment68907906_40844641)。 –