質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

10526閲覧

UFuncTypeErrorというエラーが出る。

yu_89

総合スコア34

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/24 05:05

解決したいこと

pythonでファイルから入力したデータからスペクトログラムを作成するプログラムを書いているのですが、
'numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('S1024'), dtype('float64')) -> None'
というエラーが出てしまいます。astypeを使って型変換などをしてみましたが、解決しません。
どうしたらいいですか?

入力ファイルはバイナルファイルです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "spectrogram.py", line 88, in <module> time_array, acf = hanning(time_array, Fs, N_ave) File "spectrogram.py", line 30, in hanning data_array[i] = data_array[i] * han # 窓関数をかける numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('S1024'), dtype('float64')) -> None

該当のソースコード

spectrogram.py

1import numpy as np 2from scipy import signal 3from scipy import fftpack 4from matplotlib import pyplot as plt 5 6# オーバーラップをかける関数 7def ov(data, samplerate, Fs, overlap): 8 Ts = len(data) / samplerate # 全データ長 9 Fc = Fs / samplerate # フレーム周期 10 x_ol = Fs * (1 - (overlap / 100)) # オーバーラップ時のフレームずらし幅 11 N_ave = int((Ts - (Fc * (overlap / 100))) / 12 (Fc * (1 - (overlap / 100)))) # 抽出するフレーム数(平均化に使うデータ個数) 13 14 array = [] # 抽出したデータを入れる空配列の定義 15 16 # forループでデータを抽出 17 for i in range(N_ave): 18 ps = int(x_ol * i) # 切り出し位置をループ毎に更新 19 array.append(data[ps:ps + Fs:1]) # 切り出し位置psからフレームサイズ分抽出して配列に追加 20 final_time = (ps + Fs)/samplerate # 切り出したデータの最終時刻 21 return array, N_ave, final_time # オーバーラップ抽出されたデータ配列とデータ個数、最終時間を戻り値にする 22 23# ハニング窓をかける関数(振幅補正係数計算付き) 24def hanning(data_array, Fs, N_ave): 25 han = signal.hann(Fs) # ハニング窓作成 26 acf = 1 / (sum(han) / Fs) # 振幅補正係数(Amplitude Correction Factor) 27 28 # オーバーラップされた複数時間波形全てに窓関数をかける 29 for i in range(N_ave): 30 data_array[i] = data_array[i] * han # 窓関数をかける 31 32 return data_array, acf 33 34# dB(デシベル)演算する関数 35def db(x, dBref): 36 y = 20 * np.log10(x / dBref) # 変換式 37 return y # dB値を返す 38 39# 聴感補正(A補正)する関数 40def aweightings(f): 41 if f[0] == 0: 42 f[0] = 1 43 ra = (np.power(12194, 2) * np.power(f, 4))/\ 44 ((np.power(f, 2) + np.power(20.6, 2)) * 45 np.sqrt((np.power(f, 2) + np.power(107.7, 2)) * 46 (np.power(f, 2) + np.power(737.9, 2))) * 47 (np.power(f, 2) + np.power(12194, 2))) 48 a = 20 * np.log10(ra) + 2.00 49 return a 50 51# 平均化FFTする関数 52def fft_ave(data_array, samplerate, Fs, N_ave, acf, no_db_a): 53 fft_array = [] 54 fft_axis = np.linspace(0, samplerate, Fs) # 周波数軸を作成 55 a_scale = aweightings(fft_axis) # 聴感補正曲線を計算 56 57 # FFTをして配列にdBで追加、窓関数補正値をかけ、(Fs/2)の正規化を実施。 58 for i in range(N_ave): 59 # dB表示しない場合とする場合で分ける 60 if no_db_a == True: 61 fft_array.append(acf * np.abs(fftpack.fft(data_array[i]) / (Fs / 2))) 62 else: 63 fft_array.append(db 64 (acf * np.abs(fftpack.fft(data_array[i]) / (Fs / 2)) 65 , 2e-5)) 66 # 型をndarrayに変換しA特性をかける(A特性はdB表示しない場合はかけない) 67 if no_db_a == True: 68 fft_array = np.array(fft_array) 69 else: 70 fft_array = np.array(fft_array) + a_scale 71 fft_mean = np.mean(np.sqrt(fft_array ** 2), axis=0) # 全てのFFT波形の平均を計算 72 73 return fft_array, fft_mean, fft_axis 74 75# Fsとoverlapでスペクトログラムの分解能を調整する。 76Fs = 1024 # フレームサイズ 77overlap = 75 # オーバーラップ率 78 79f = open("/home/nomo/b200_220215_0718_30_40_6000_TEST.dat", "rb") # ファイル読み込み 80data = f.read() 81samplerate = 30000000 82x = np.arange(0, 1, 0.1) 83 84# オーバーラップ抽出された時間波形配列 85time_array, N_ave, final_time = ov(data, samplerate, Fs, overlap) 86 87# ハニング窓関数をかける 88time_array, acf = hanning(time_array, Fs, N_ave) 89 90# FFTをかける 91fft_array, fft_mean, fft_axis = fft_ave(time_array, samplerate, Fs, N_ave, acf, no_db_a=True) 92 93# スペクトログラムで縦軸周波数、横軸時間にするためにデータを転置 94fft_array = fft_array.T 95 96# ここからグラフ描画 97# グラフをオブジェクト指向で作成する。 98fig = plt.figure() 99ax1 = fig.add_subplot(111) 100 101# データをプロットする。 102im = ax1.imshow(fft_array, 103 vmin=0, vmax=np.max(fft_array), 104 extent=[0, final_time, 0, samplerate], 105 aspect='auto', 106 cmap='jet') 107 108# カラーバーを設定する。 109cbar = fig.colorbar(im) 110cbar.set_label('SP [Pa]') 111 112# 軸設定する。 113ax1.set_xlabel('Time [s]') 114ax1.set_ylabel('Frequency [Hz]') 115 116# スケールの設定をする。 117ax1.set_xticks(np.arange(0, 50, 1)) 118ax1.set_yticks(np.arange(0, 20000, 200)) 119ax1.set_xlim(0, 5) 120ax1.set_ylim(0, 1000) 121 122# グラフを表示する。 123plt.show() 124plt.close() 125

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラー中のdtype('S1024')というのは計算対象がbytes型であることを示しており、bytes値とfloat64値は掛け算できません。
よってバイナリデータを整数や実数などの適切な(意図した)数値型に変換する必要があります。
なお具体的な修正方法については、元ファイルデータ構造や処理の詳細が不明なため、コード作成者しか示せないかと思います。

Python

1import numpy as np 2 3b = np.array(b'123') 4print(b, b.dtype) # b'123' |S3 5print(b*1.23) 6# numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('S3'), dtype('float64')) -> None

投稿2022/06/24 05:31

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_89

2022/06/24 07:44

ご回答いただき、ありがとうございます。 なるほど。そういうことでしたか。ありがとうございます! 修正方法については承知しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問