🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

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

Python

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

Q&A

解決済

1回答

3111閲覧

定義した関数を二回呼び出し結果を得ることができない

itsukidesu

総合スコア6

NumPy

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

Python

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

0グッド

0クリップ

投稿2019/10/26 09:56

編集2019/10/26 14:46

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)現在、pythonを用いてクロススペクトル法に関するプログラムを書いていいるのですが、関数を定義してリストにreturnで追加を行いたいのですが二回同じ関数に変数を入れると2回目の呼び出し時の計算でエラーが発生します。これまでC言語でプログラムを書いてきて、今回pythonの学習のため書き換えているためpythonに関する知識はそれ程ありませんが、調べても一向に解決出来そうにないため質問させて頂きました。
関数定義を呼び出すプログラムを実装中に以下のエラーメッセージが発生しました。

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

% python3 acoustic_ranging.py Traceback (most recent call last): File "acoustic_ranging.py", line 65, in <module> transmits, reflects = Wave(x[1], i) #波の作成関数に値を渡す File "acoustic_ranging.py", line 22, in Wave transmit += Transmitted(x,i,j) File "acoustic_ranging.py", line 27, in Transmitted return A * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*x)/c + theta) TypeError: 'numpy.ndarray' object is not callable

該当のソースコード

python

1import numpy as np 2import math 3import random 4import matplotlib.pyplot as plt 5from statistics import mean 6 7pi, cos, sin = np.pi, np.cos, np.sin #数式の省略 8F, F_min, F_max = 44100.0, 2153, 7644 #サンプリング周波数, 最大, 最小 9F_w = F_max - F_min #周波数帯域幅 10N, N_freq = 2048, 256 #データ点数, 周波数領域でのデータ点数 11A, gannma, theta, c = 1.0, 0.2, 0.0, 340.0 #振幅スペクトル, 反射係数, 初期位相, 音速 12d, d_min = 1.0, c/(2*F_w*(N/N_freq)) #対象物までの距離, 最小測定可能距離 13x = [0.0, 0.006] #マイクロホンの位置 14 15def f(j): #第j周波成分の周波数 16 return (F/N) * (j+100) 17 18def Wave(x, i): #波の作成 19 transmit, reflect = 0.0, 0.0 20 for j in range(N_freq): 21 transmit += Transmitted(x,i,j) 22 reflect += Reflected(x,i,j) 23 return transmit, reflect #それぞれの値を返す 24 25def Transmitted(x,i,j): #送信波成分 26 return A * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*x)/c + theta) 27 28def Reflected(x,i,j): #反射波成分 29 return A * gannma * cos((2*pi*f(j)*(i/F-0.02)) - (2*pi*f(j)*(2*d-x))/c + theta+pi/2) 30 31def Rand(i): #乱数の生成 32 return (random.uniform(0,1)-0.5)*2 #-1〜1までの乱数 33 34#channel 1 35vt, vr, vc = [], [], [] #波の成分を格納するリストの作成 36for i in range(N): 37 transmit, reflect = Wave(x[0], i) #波の作成関数に値を渡す 38 vt.append(transmit) #送信波の格納 39 vr.append(reflect) #反射波の格納 40 vc.append(transmit + reflect) #合成波の生成 41 42gaus = [] #ガウス乱数を入れるための配列 43for i in range (512): 44 gaus.append(Rand(i)*math.exp(-i*0.1)) 45 46wave = [] #測定系のノイズを入れるための配列 47for i in range (N): 48 figure = 0 49 for j in range (512): 50 if (i-j) >=0: 51 figure += gaus[j]*vc[i-j] #合成波にガウス乱数を畳み込む 52 wave.append(figure) 53 54f = np.fft.fft(wave) #vcを高速フーリエ変化行いfに格 55 56f2 = [] #データの抽出を行う 57for i in range(N): 58 if F/N*i>=F_min and F/N*i<=F_max: #周波数帯域でデータを抽出 59 f2.append(f[i]) 60 61#channel 2 62vt2, vr2, vc2 = [], [], [] #波の成分を格納するリストの作成 63for i in range(N): 64 transmits, reflects = Wave(x[1], i) #波の作成関数に値を渡す 65 vt2.append(transmits) #送信波の格納 66 vr2.append(reflects) #反射波の格納 67 vc2.append(transmits + reflects) #合成波の生成 68 69```位置 70 71### 試したこと 72 73channel2をコメントアウトするとプログラムは実行でき欲しい結果の一つが得られます。 74また、反射波や送信波の関数の数式をx+iなどの簡単な式にしても実行することができます。 75また、1回目に渡すデータを入れ替えても1回目だけなら実行できます。 76したがって、原因は式にあると思うのですがその場合、一回だけなら結果が得られる理由を良くわかりません。 77 78### 補足情報(FW/ツールのバージョンなど) 79 80pythonはバージョン3.7.3を使っています

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

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

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

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

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

y_waiwai

2019/10/26 10:12

これではコードが読めません。質問を編集し、<code>ボタンを押し、でてくる’’’の枠の中にコードを貼り付けてください
pepperleaf

2019/10/26 12:03

関数とか、for の ":" の次の行がインデントされてませんが、単なる転記ミス?
meg_

2019/10/26 13:58

質問のコードを試しましたが、エラーは出ませんでした。 ※上記コードのままでは実行できませんので、インデントは当方で修正した状態で実行しました。
guest

回答1

0

ベストアンサー

def f(j): #第j周波成分の周波数
f = np.fft.fft(wave) #vcを高速フーリエ変化行いfに格

関数名を同じ変数名で上書きしているのが原因ではないでしょうか?

投稿2019/10/26 18:53

TaroToyotomi

総合スコア1448

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

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

meg_

2019/10/27 02:22

あれ? 質問のコードが昨日から編集されているようですね? 昨日のコードで実行したところ、私の環境ではエラーなく実行できました。謎ですねぇ。
itsukidesu

2019/10/28 05:12

遅くなってすみません。 変数を変更すると実行することができました。 しかし、変数が原因だとするとエラーのタイミングやメッセージの意味がわからないのですがよろしければ解説していただけないでしょうか?
TaroToyotomi

2019/10/29 10:49

1回目の呼び出しの後に上書きしているので2回目以降の呼び出しでエラーになるのでは。 エラーメッセージの内容は、文字通り'numpy.ndarray'オブジェクトを関数呼び出ししようとしたという内容です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問