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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

2回答

319閲覧

Python3 実数値を引数に取る関数に整数を与えると理想の結果を得られない。

Mukomiz

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/01/22 08:31

お世話になります
Pythonで計算を行った際に、理想の結果とならず
何故、そうなるのかもよく分かりません
以下は、x[0]^2 + x[1]^2という関数に対して
x[0],x[1]に任意の数値を代入して、その地点での各々の傾きを求めるコードです

コード下部のように、引数に整数値を入れると理想的でない結果が
引数に実数値を入れると理想の結果が得られます。

関数内部で暗黙的なキャストが出来てないとか、引数の指定が悪い事は分かるのですが
何故、整数を指定した場合にエラーではなく[15000 15000]という結果が得られるのかが分かりません。
どのような理由でこの数値になるのでしょうか?
初歩的で恐縮ですが、詳しい方アドバイス頂けましたら幸いです。

Python3

1def func_2(x): 2 return np.sum(x**2) 3 4def numerical_gradient(f,x): 5 h = 1e-4#0.0001 6 grad = np.zeros_like(x) 7 8 for idx in range(x.size): 9 tmp_val = x[idx] 10 #f(x + h)計算 11 x[idx] = tmp_val + h 12 fxh1 = f(x) 13 14 #f(x - h)計算 15 x[idx] = tmp_val - h 16 fxh2 = f(x) 17 18 grad[idx] = (fxh1 - fxh2) / (2 * h) 19 x[idx] = tmp_val 20 21 return grad 22 23#理想の出力が得られる 出力( [-4 -4]) 24numerical_gradient(func_2,np.array([-2.0,-2.0]) 25 26#理想の出力が得られない 出力( [15000 15000]) 27numerical_gradient(func_2,np.array([-2,-2]) 28

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

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

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

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

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

guest

回答2

0

numpy内部の詳しい挙動は把握していませんが、一度確保された配列は型intを維持しています。
提示コードでは、floatの演算結果値を配列に再代入していますが、その結果はintに丸められてしまい、提示のようなおかしな結果になっています。
対処法としては~np.array([-2,-2],dtype=float)と型を指定するのがよいかと思います。

以下単純な検証コードです。

Python

1a = np.array([-2,-2]) 2b = a[0] + 1e-4 3print(type(b),b) # <class 'numpy.float64'> -1.9999 4 5a[0] = b # 代入先はintなので小数部が切り捨てられる! 6print(type(a[0]),a[0]) # <class 'numpy.int32'> -1

投稿2019/01/22 08:59

can110

総合スコア38234

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

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

Mukomiz

2019/03/25 05:24

御回答ありがとうございます! 型の問題でしたか・・・初歩的な知識不足でした・・・
guest

0

x を np.array([-2,-2]) とした場合、型が int 型となります。
print(x.dtype) # int64

なので、x[0] = -1.9999 のように浮動小数点数を代入しても int に丸められて x[0] = -1 となってしまいます。
計算途中で print(x) を入れるとなにが起きているかわかるかと思います。


簡略化した例

python

1def f(x): 2 '''f(x, y) = x^2 + y^2 3 ''' 4 return (x**2).sum() 5 6 7def grad(x, h=1e-4): 8 '''中心差分近似で \nabla f(x, y) を求める。 9 ''' 10 fx1 = (f(x + [h, 0]) - f(x - [h, 0])) / (2 * h) 11 fx2 = (f(x + [0, h]) - f(x - [0, h])) / (2 * h) 12 return np.array([fx1, fx2]) 13 14# 型を指定しない場合、値から型が推論される。 15print(grad(np.array([-2., 2.]))) # [-4. 4.] 16 17# 明示的に型を指定 18print(grad(np.array([-2, 2], dtype=float))) # [-4. 4.]

投稿2019/01/22 08:49

編集2019/01/22 09:03
tiitoi

総合スコア21956

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

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

Mukomiz

2019/03/25 05:25

御回答ありがとうございます! 初歩的な内容で恐縮です・・・精進致します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問