@hiroko_doze (hiroko h)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonの "boolean indexエラー" 解消方法

Q&A

Closed

解決したいこと

pythonで周波数のノイズ除去をしたいですが"F[(fq > fc)] = 0 "でboolean indexエラーが出てしまい、つまずいています。
どのようにすれば解決できるか、教えていただけますか。

発生している問題・エラー

boolean index did not match indexed array along dimension 0; dimension is 54272 but corresponding boolean dimension is 131072

該当するソースコード

# 周波数軸 linspace(開始,終了,分割数)
fq = np.linspace(0, 1.0/dt, N)  
# カットオフ(周波数)     
fc = 40                           
# カットオフを超える周波数のデータをゼロにする(ノイズ除去)
F[(fq > fc)] = 0   

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
・Fのデータです。F.sizeは108544が、"F"で中を見ると、131072 rows × 4 columnsとなっています。
F.PNG

・fqのデータです。fq.sizeは131072でした。
fq.PNG

0 likes

3Answer

fq.shape(131072,1)であることが原因のように見えます。fq.ravel()fq.shape(131072,)にしてから試してみてください。

>>> import numpy as np

# 簡単のため、信号長を131072 -> 10に、信号の値を乱数にしています
>>> F = np.random.rand(10, 4)
>>> F.shape
(10, 4)
>>> fq = np.random.rand(10)
# fqのshapeが (10,) だと、意図通りに動きます
>>> fq.shape
(10,)
>>> fc = 0.5
>>> (fq > fc).shape
(10,)
>>> F[(fq > fc)] = 0

# fq.shapeを (10,1) にしてみます
>>> fq = np.random.rand(10,1)
>>> fq.shape
(10, 1)
# エラーが出ます
>>> F[(fq > fc)] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: boolean index did not match indexed array along dimension 1; dimension is 4 but corresponding boolean dimension is 1

# ravelしてfq.shapeを (10,1) -> (10,) にします
>>> fq = fq.ravel()
>>> fq.shape
(10,)
# これで通ります
>>> F[(fq > fc)] = 0

(fq > fc).shapeF.shape と同じ場合、エラーが出ずに処理できます。
あるいは、(fq > fc).shape = (10,)F.shape = (10, 4) のときのように、行列の次元数が異なる(前者は1次元で、後者は2次元)場合は、共通する次元の長さが等しいことが条件です(この例では1軸目の10が等しいので、エラーが発生しません)。なお、この場合は、次元を合わせるように行列が自動的にコピーされます(このコピー処理はブロードキャストと呼ばれます)。すなわち、(fq > fc) は2軸目に4つコピーされ、shape(10, 4)になった後にFと演算されます。

2Like

Comments

  1. @hiroko_doze

    Questioner

    ありがとうございます。理解も出来ました!!助かりました。

F.shapeはどのように出力されるでしょうか?行数よりsizeが小さいことが気になります。
エラーの通り単純に次元数が違うだけのようなので、確認したいです。

0Like

Comments

  1. @hiroko_doze

    Questioner

    コメントありがとうございます。色々なアドバイスを頂き、試行錯誤したら出来ました(^^)/。

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌