質問1
NumPyでない配列(リスト)を複製する場合に単純な代入では
python
1list1 = ['A', 'B', 'C'] 2 3list2 = list1 4list2[0] = '1' 5 6print(list1) 7# ['1', 'B', 'C'] 8 9print(list2) 10# ['1', 'B', 'C']
このように、コピー先を書き換えるとコピー元にも影響してしまいます。これは、NumPyの配列でも同じでしょうか?
質問2
この対策として、NumPyでない配列(リスト)の場合は
python
1a = [1] 2b = a.copy() 3
このような方法があるのですが、この対策はNumPyの配列でも通用しますか?
質問3
python
1 spectrogram = np.zeros((num_frames, int(fft_size/2)+1)) 2 3 for frame_idx in range(num_frames): 4 # 分析の開始位置は,フレーム番号(0始まり)*フレームシフト 5 start_index = frame_idx * frame_shift 6 7 # 1フレーム分の波形を抽出 8 frame = waveform[start_index : \ 9 start_index + frame_size].copy()#------------------------1 10 11 # ハミング窓を掛ける 12 frame = frame * np.hamming(frame_size) 13 14 # 高速フーリエ変換(FFT)を実行 15 spectrum = np.fft.fft(frame, n=fft_size) 16 17 # 振幅スペクトルを得る 18 absolute = np.abs(spectrum) 19 20 # 振幅スペクトルは左右対称なので,左半分までのみを用いる 21 absolute = absolute[:int(fft_size/2) + 1] 22 23 # 対数を取り、対数振幅スペクトルを計算 24 log_absolute = np.log(absolute + 1E-7) 25 26 # 計算結果をスペクトログラムに格納 27 # 数字のところをコロンにするとその軸全部とってくる 28 spectrogram[frame_idx, :] = log_absolute#---------------------------------2
1では
frame = waveform[start_index : start_index + frame_size].copy() と書かれており、配列をちゃんとコピーしている。
一方で、2では
spectrogram[frame_idx, :] = log_absolute と書かれており、log_absoluteが配列であるにもかかわらずそのまま代入している。
これでは、for文で繰り返す中で、1つ前の繰り返しによって代入されたspectrogramの行が、今の繰り返しの代入によって同じ値になってしまわないのでしょうか?
繰り返し1回目:
(1,2,3,4) ←代入された
繰り返し2回目:
(5,6,7,8) ←ここも同時に書き換えられないのか?
(5,6,7,8) ←代入された
繰り返し3回目:
(1,3,5,7) ←ここも同時に書き換えられないのか?
(1,3,5,7) ←ここも同時に書き換えられないのか?
(1,3,5,7) ←代入された
.
.
.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/03 13:27
2021/11/03 14:46
2021/11/03 15:17
2021/11/03 17:56
2021/11/03 20:33
2021/11/04 09:05 編集
2021/11/09 13:58 編集