2017-06-20 15 views
6

私は精通していないよMATLABで次のコードを持っている:私はエラーを取得する行列をMatlabからPythonに変換するにはどうすればよいですか?

def segment_energy(data, th): 
    mag = np.linalg.norm((data['x'], data['y'], data['z'])) 
    print "This is the mag: " + str(mag) 
    mag -= np.mean(mag) 

    above = np.where(mag >= th * np.std(mag)) 
    indicator = np.zeros(mag.shape) 
    indicator[above] = 1 
    plt.plot(mag) 
    plt.plot(indicator * 1000, 'r') 
    plt.show() 

line 23, in segment_energy 
indicator[above] = 1 
IndexError: too many indices for array 
私はPythonで、この次の関数を書いた

function segments = segmentEnergy(data, th) 
    mag = sqrt(sum(data(:, 1:3) .^ 2, 2)); 
    mag = mag - mean(mag); 

    above = find(mag>=th*std(mag)); 
    indicator = zeros(size(mag)); 
    indicator(above) = 1; 
    plot(mag); hold on; plot(indicator*1000, 'r') 
end 

dataは、三軸加速度計データを含むCSVファイルから読み取られたパンダDataFrameです。加速度計データの軸は、x,y、およびzです。データフレームの列は、timestamp,time skipped,x,y,zおよびlabelの順になっています。

エラーは、Pythonコードのmagがスカラーであり、私が行列のように扱っているためです。しかし、どのように彼らがmagをMATLAB関数の行列に変換しているのかよくわかりません。

+2

「データ」とは何ですか? –

+0

'data'はCSVファイルのデータフレームです。 – dirtysocks45

+0

次に、 'mag = np.linalg.norm(data.iloc [:、1:3] .values())'を使ってみてください。 –

答えて

3

デフォルトではnumpy.linalg.normという出力は、現在どのように関数を呼び出しているかに応じて、単一のスカラー値を与えます。 magの出力が今スカラーなので、コードの残りの部分は、以下の理由で意図したとおりに機能しません。単一のスカラーで平均減算を実行

  1. はあなたに0の値を与える(すなわちmag <- mag - np.mean(mag) --> 0を) 。

  2. aboveステートメントは、常に1つの要素のタプルを返します。この要素は、インデックス0を含む長さ1のNumPy配列を含み、この場合スカラである「配列」の最初の要素が制約を満たしていることを示します。これは、既定の定義np.stdを使用することにより、単一の定数の標準偏差も0であるため、常に満足されます。

  3. 単一スカラー値のshapeを呼び出すことは定義されておらず、実際には空の形を与えます:()numpy.meanで減算しなかった場合、mag.shapeを実行するとNumPy配列ではないため実際にエラーが発生することに注意してください。 np.meanで減算すると、スカラーがNumPy配列に統合されます。

    In [56]: mag = 10 
    
    In [57]: type(mag) 
    Out[57]: int 
    
    In [58]: mag -= np.mean(mag) 
    
    In [59]: type(mag) 
    Out[59]: numpy.float64 
    
  4. 最後に、indicator作成コードを呼び出すと、空の次元の配列を生成します、あなたは何のサイズを持っていない配列のインデックスにしようとしているので、それはあなたにエラーを与える:

    を観察します。

言う... 10とth = 1 ... magはいくつかの値になるように計算されたと仮定し、この再現性のあるエラーを守ってください。

In [60]: mag = 10 

In [61]: mag -= np.mean(mag) 

In [62]: mag.shape 
Out[62]:() 

In [63]: th = 1 

In [64]: above = np.where(mag >= th * np.std(mag)) 

In [65]: indicator = np.zeros(mag.shape) 

In [66]: indicator 
Out[66]: array(0.0) 

In [67]: mag 
Out[67]: 0.0 

In [68]: indicator[above] = 1 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-67-adf9cff7610a> in <module>() 
----> 1 indicator[above] = 1 

IndexError: too many indices for array 

したがって、あなたのためのソリューションは、あなたがどのように再考することですこの関数を書く。MATLABコードでは、すでにdataが2D行列であると仮定しているため、各行のノルムまたは長さを独立して計算しています。入力がパンダDataFrameであることがわかっているので、MATLABの場合と同様に、numpy操作を非常に簡単に適用できます。コードにxyzのラベルが付けられ、各列の値がnumpyの配列であると仮定すると、コードの最初の行を変更するだけです。

def segment_energy(data, th): 
    mag = np.sqrt(np.sum(data.loc[:, ['x','y','z']]** 2.0, axis=1)) # Change 
    mag = np.array(mag) # Convert to NumPy array 
    mag -= np.mean(mag) 

    above = np.where(mag >= th * np.std(mag)) 
    indicator = np.zeros(mag.shape) 
    indicator[above] = 1 
    plt.plot(mag) 
    plt.plot(indicator * 1000, 'r') 
    plt.show() 

コードの最初のステートメントは、MATLABのコードの実際のNumPy変換です。我々は、あなたが探している3つの列をインデックスするためにパンダDataFrameの一部であるlocメソッドを使用します。残りの計算を実行するにはNumPy配列に変換する必要もあります。

numpy.linalg.normを使用することもできますが、操作する軸はと指定してください。データが2Dであるので、あなたのマトリックスの行方向規範を計算するためにaxis=1を指定:

mag = np.linalg.norm(data.loc[:, ['x', 'y', 'z']], axis=1) 

上記のあなたのためにnumpyの配列にデータを合体します。

+0

'data'は3軸加速度計データを含むCSVファイルから読み取られたパンダデータフレームです。加速度計データの軸は、「x」、「y」、および「z」である。ご協力いただきありがとうございます。もう説明が必要な場合は、お気軽にお問い合わせください。データフレームの列は、 'timestamp'、' time skipped'、 'x'、' y'、 'z'、' label'の順になっています。 – dirtysocks45

+1

@ dirtysocks45は理解しています。私はあなたがパンダを使っているという事実を活用するために私の答えを編集しました。私は、列の位置のコードにとらわれず、ラベルを直接使用しました。 – rayryeng

+1

これで問題は解決しました。ありがとう。 – dirtysocks45

関連する問題