条件に応じて配列に値を割り当てる方法(MATLAB→Python変換)

2020-07-23 python python-3.x matlab function variable-assignment

これは、実行できたMATLABコードの一部です(他の重要でない変数を除く)。コンテキストについては、完全なMATLABプログラムが、原子間力顕微鏡からのバンド励起応答をシミュレートします(コードエラーには関係ありません)。

IO_rate = 4E6; %[samples/sec]
w1 = 200E3; % lower edge of band
w2 = 400E3; % upper edge of band
N_pixels = 128; % number of pixels along a line scan
N_points_per_pixel = 2^13; % number of data points per pixel
w_vec = -IO_rate/2: IO_rate/N_points_per_pixel : IO_rate/2-IO_rate/N_points_per_pixel; %frequency vector over a pixel

% build drive signal, define in the Fourier domain
D_vec = zeros(size(w_vec));
D_vec( ((abs(w_vec)<w2) + (abs(w_vec)>w1)) == 2 ) = 1; % drive bins located within upper and lower band edges
band_ind = find( (((w_vec)<w2) + ((w_vec)>w1)) == 2 );

現在、コードをPythonに変換しています。これが今のところ

IO_rate = 4E6; #[samples/sec]
w1 = 200E3; # lower edge of band
w2 = 400E3; # upper edge of band
N_pixels = 128; # number of pixels along a line scan
N_points_per_pixel = 2^13; # number of data points per pixel
w_vec = np.arange(-IO_rate/2, IO_rate/2-IO_rate/N_points_per_pixel, IO_rate/N_points_per_pixel)
D_vec = np.zeros(np.size(w_vec))

ただし、 D_vec( ((abs(w_vec)<w2) + (abs(w_vec)>w1)) == 2 ) = 1; Pythonへ。それは私のMATLABコードではありませんが、関数呼び出しに値を割り当てようとしているように見えます。なぜなのか、また、行が実際に何をしているのかわかりません。この行をPythonに変換する方法を誰かが知っていますか?

Answers

ステートメントtmp = ((abs(w_vec)<w2) + (abs(w_vec)>w1)) == 2は、 w_vec[i] < w2場合、 tmp[i]がtrueである論理(true / false)配列を返しますw_vec[i] < w2 および w_vec[i] > w1 。 Matlabは暗黙的にtrue / false値を0または1に変換するため、合計が2に等しいかどうかを確認することは、 両方のサブ条件が満たされているかどうかを確認することと同じです。

この配列をDvecDvec 、それを使用してDvecの対応するエントリを1に設定できます。

^はPythonのXOR演算子であり、べき乗演算子ではないことに注意してください。 MATLABのa ^ bは、Pythonのpow(a,b) a**bまたはpow(a,b)と同等です。

これが私の変換です:

  IO_rate = 4E6; #[samples/sec]
  w1 = 200E3; # lower edge of band
  w2 = 400E3; # upper edge of band
  N_pixels = 128; # number of pixels along a line scan
  N_points_per_pixel = pow(2,13); # number of data points per pixel

  #Note the +1 in the second argument of arange
  w_vec = np.arange(-IO_rate/2, IO_rate/2-IO_rate/N_points_per_pixel + 1, IO_rate/N_points_per_pixel);
  D_vec = np.zeros(np.size(w_vec));

  #Find the indices that satisfy both conditions
  ind = (abs(w_vec)<w2) & (abs(w_vec)>w1);
  D_vec[ind] = 1; #assign those indices to 1.

  band_ind = np.nonzero(((w_vec)<w2) & ((w_vec)>w1));

新しい配列を作成するためのNumpyイディオム。その形状は最初の配列と一致し、その値は最初の配列値の論理テストに依存しますnumpy.where

私があなたの別の質問で 答えたように、

D = np.where(np.logical_and(np.abs(v)>low, np.abs(v)<hi), 1, 0)

Related