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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

809閲覧

2次元配列の時の数値の丸め方について

suugaku_nyumon

総合スコア37

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2021/08/28 12:19

質問内容

・ウィキペディア「ガウス・ニュートン法」
https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E3%83%BB%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95

こちらのサイトの例にありますガウスニュートン法を用いたモデルのフィッティングの再現をしています。小数点の表示を3桁以下にして表示したく「np.set_printoptions(precision=3)」とコードに入れておりますが、出力が小数点3桁以下とならず予想に反した表示となります。

数値自体は合っていると思われますが、出力を小数点3桁以下にするにはどうすればよろしいでしょうか?

コード

Python3

1# coding: utf-8 2import numpy as np 3import matplotlib.pyplot as plt 4 5theta_1 = 0.9 6theta_2 = 0.2 7 8x = [0.038,0.194,0.425,0.626,1.253,2.500,3.740] 9y = [0.050,0.127,0.094,0.2122,0.2729,0.2665,0.3317] 10 11def res1(a,b): 12 calcu3 = - a / (theta_2 + a) 13 return calcu3 14 15def res2(a,b): 16 calcu4 = (theta_1 * a) / ((theta_2 + a)**2) 17 return calcu4 18 19def res3(a,b): 20 calcu5 = b - (theta_1 * a) / (theta_2 + a) 21 return calcu5 22 23i = 0 24 25for i in range(0,10): 26 27 residu = np.array([[res3(x[0],y[0])],[res3(x[1],y[1])],[res3(x[2],y[2])],[res3(x[3],y[3])],[res3(x[4],y[4])],[res3(x[5],y[5])],[res3(x[6],y[6])]]) 28 29 jacobi_t = np.array([[res1(x[0],y[0]),res1(x[1],y[1]),res1(x[2],y[2]),res1(x[3],y[3]),res1(x[4],y[4]),res1(x[5],y[5]),res1(x[6],y[6])],[res2(x[0],y[0]),res2(x[1],y[1]),res2(x[2],y[2]),res2(x[3],y[3]),res2(x[4],y[4]),res2(x[5],y[5]),res2(x[6],y[6])]]) 30 jacobi = np.array([[res1(x[0],y[0]),res2(x[0],y[0])],[res1(x[1],y[1]),res2(x[1],y[1])],[res1(x[2],y[2]),res2(x[2],y[2])],[res1(x[3],y[3]),res2(x[3],y[3])],[res1(x[4],y[4]),res2(x[4],y[4])],[res1(x[5],y[5]),res2(x[5],y[5])],[res1(x[6],y[6]),res2(x[6],y[6])]]) 31 32 jacobi_mul = np.dot(jacobi_t,jacobi) 33 jacobi_invmul = np.linalg.inv(jacobi_mul) 34 35 delta_theta = -np.dot(np.dot(jacobi_invmul,jacobi_t),residu) 36 37 theta_1 = theta_1 + delta_theta[0,0] 38 theta_2 = theta_2 + delta_theta[1,0] 39 40 np.set_printoptions(precision=3) 41 42 print("theta_1[" + str(i) + "] = " + str(theta_1) + "\t") 43 print("theta_2[" + str(i) + "] = " + str(theta_2) + "\n") 44 45 i += 1

出力結果

theta_1[0] = 0.3326629279063379 theta_2[0] = 0.2601739065636697 theta_1[1] = 0.3428092548404625 theta_2[1] = 0.42607917994138833 theta_1[2] = 0.35777521550273894 theta_2[2] = 0.5295084359436374 theta_1[3] = 0.3614054587650916 theta_2[3] = 0.5536581025916869 theta_1[4] = 0.36180308278463424 theta_2[4] = 0.556072534220654 theta_1[5] = 0.36183442015991113 theta_2[5] = 0.5562524645285597 theta_1[6] = 0.3618366954234483 theta_2[6] = 0.5562654497238558 theta_1[7] = 0.3618368593026168 theta_2[7] = 0.5562663846290323 theta_1[8] = 0.3618368710998805 theta_2[8] = 0.5562664519286844 theta_1[9] = 0.36183687194910424 theta_2[9] = 0.556266456773227

試したこと

「np.set_printoptions(precision=3)」の書く位置が違うのかと思いまして、「for i in range(0,10):」の前や「import matplotlib.pyplot as plt」の次の行に書いてみたりしています。しかし、位置を変えても小数点が3桁以下となりません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Ftpsさんの通りですが、理由を説明すると、

np.set_printoptions はnp.arrayそのものを表示するときの扱いを設定するためのものだから

です。値そのものが変更になるわけではないので、値の取り出しや、取り出した値の表示には影響しません。

python

1import numpy as np 2 3y = np.array([0.050,0.127,0.094,0.2122,0.2729,0.2665,0.3317]) 4 5print(y) # [0.05 0.127 0.094 0.2122 0.2729 0.2665 0.3317] 6print(y[4]) # 0.2729 7 8np.set_printoptions(precision=3) 9 10print(y) # [0.05 0.127 0.094 0.212 0.273 0.267 0.332] 11print(y[4]) # 0.2729 12

投稿2021/08/28 15:00

TakaiY

総合スコア13687

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

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

suugaku_nyumon

2021/08/28 23:22

ご回答ありがとうございます。np.arrayそのものが対象でしたか。今回は配列を表示させていたわけではなく、要素を取り出して表示させていたので、np.set_printoptionsの効果が無かったのですね。私の理解不足でした。
guest

0

roundを使用してみたらどうでしょう?

py

1 theta_1 = theta_1 + delta_theta[0,0] 2 theta_2 = theta_2 + delta_theta[1,0] 3 theta_1_round=round(theta_1,3) 4 theta_2_round=round(theta_2,3) 5 6 np.set_printoptions(precision=3) 7 8 9 print("theta_1[" + str(i) + "] = " + str(theta_1_round) + "\t") 10 print("theta_2[" + str(i) + "] = " + str(theta_2_round) + "\n") 11

37行目から最後まで記述しています。

投稿2021/08/28 13:19

Ftps

総合スコア295

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

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

suugaku_nyumon

2021/08/28 23:18

ご回答ありがとうございます。仰る通りroundを使用すると、小数点以下3桁の表示とすることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問