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

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

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

269閲覧

pythonのfor文で意図しない値が入ってしまう

_hh

総合スコア79

Python 3.x

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

0グッド

1クリップ

投稿2019/11/28 08:53

編集2019/11/28 08:56

pythonを用いてポアソン回帰をしております。問題はポアソン回帰ではなく、その結果を用いてグラフを描く時点で、単純にfor文を用いて配列に値を入れる際に、意図しない動作になってしまっており困っております。

python3

1import numpy as np 2import seaborn as sns 3import pandas as pd 4import matplotlib.pyplot as plt 5import statsmodels.api as sm 6import scipy as sp 7 8d = pd.read_csv('Beer.csv',encoding='SHIFT-JIS') 9d.head() 10 11X = d[['temperature']] 12y = d[['beer_number']] 13model = sm.GLM(y, sm.add_constant(X), family=sm.families.Poisson()) 14res=model.fit() 15 16# 予測値の作成 17x_axis = np.arange(0, 45) 18y_seq = x_axis 19 20for i in range(len(x_axis)): 21 print("i") 22 print(i) 23 XX=sp.array([1,x_axis[i]]) 24 print(XX) 25 zz=XX.dot(res.params) 26 print(zz) 27 28 kk=np.exp(zz) 29 print("kk") 30 print(kk) 31 32 y_seq[i] = kk 33 print("yy") 34 print(y_seq[i]) 35

【結果】
i
0
[1 0]
0.4476074167974242
kk
1.5645643533866962
yy
1
i
1
[1 1]
0.5236838580746012
kk
1.6882354281048548
yy
1
i
2
[1 2]
0.5997602993517781
kk
1.82168208967493
yy
1
【質問したいこと】
上記で変数y_seqという配列に、ポアソン回帰の結果のyの予測値を入れたいのですが、なぜか
意図しない整数値ばかりが入ってしまいます。不思議なことに、zzという値をネイピア数のべきにした値、kkというところまではprintすると想定通りの値が入っているのですが、それを単純にそのままy_seq[i]に入れた後に出力すると、そちらの結果は切り下げ?た様な整数値が入ってしまいます。何等かのバグでしょうか、、。ご教示のほど、宜しくお願い申し上げます。

なお、同じことをRで実装すると全く問題なく意図する結果となります。

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

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

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

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

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

guest

回答2

0

整数型のnumpy配列に小数点数を代入すると整数型に変換されます。

python

1>>> import numpy as np 2>>> a = np.arange(3) 3>>> a 4array([0, 1, 2]) 5>>> a.dtype 6dtype('int64') 7>>> a[0] = 1.414 8>>> a 9array([1, 1, 2])

対策:最初からnumpy.float64の配列にする。

python

1>>> a = np.arange(3, dtype=np.float64) 2>>> a 3array([0., 1., 2.]) 4>>> a[0] = 1.414 5>>> a 6array([1.414, 1. , 2. ])

投稿2019/11/28 09:20

hayataka2049

総合スコア30935

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

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

0

自己解決

済みません、上記ですが、以下2点により解決致しました。
①x_axis = np.linspace(0, 45,30) とする。
②for文終了後に、改めてx_axis = np.linspace(0, 45,30) とする。

②を行わない場合、なぜかx_axisの値もy_seqと同じになってしまい、
直線y=xのグラフになってしまいます(pythonのバグと思われます)。

投稿2019/11/28 09:17

_hh

総合スコア79

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

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

TaniguchiTakaki

2019/11/28 09:24

多分Pythonのバグではないです。 y_seq = x_axis の動作を理解してないのではないでしょうか?
hayataka2049

2019/11/28 09:27

バグではありません。 ①はnumpyのたぶん明文化された仕様(リファレンスは拾っていないので、そういう記述がないかどうか探してみてください)。②は代入がコピーを作らないからで、Pythonの基本的な仕様です(参照:https://docs.python.org/ja/3/faq/programming.html#id17)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問