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

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

詳細はこちら
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

486閲覧

pythonのコードの一般論について

icemanstanding

総合スコア73

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2019/12/30 04:57

Python初心者です。
23年ぶりにプログラムの真似事をしました。
多変数の近似式を求めるコードを書きました。
結果は望んだとおりにできたのですが、
ダラダラとした印象があります。
コードの書き方に改善点などあればご指摘ください。

#csvの操作用にインポート import csv #csvの数値計算用のライブラリをインポート import numpy as np #データ数のカウント def csv_in(): with open('C:/Users/.spyder-py3/191224~/testdataXYZ.csv') as f: val0 = float(0) gyo = float(0) ret = float(0) reader = csv.reader(f) val0 = [row for row in reader] f.close() gyo = np.shape(val0)[0] ret = np.shape(val0)[1] return gyo #データの入力 def csv_in2(): with open('C:/Users/.spyder-py3/191224~/testdataXYZ.csv') as f: val0 = float(0) reader = csv.reader(f) val0 = [row for row in reader] f.close() return val0 #データの切り分け def val_cut(j,val2): n = [val2[i][0] for i in range(j)] x = [val2[i][1] for i in range(j)] y = [val2[i][2] for i in range(j)] z = [val2[i][3] for i in range(j)] #文字の削除 del n[0],x[0],y[0],z[0] val3 = x,y,z, return val3 # 定数項、偏回帰係数の算出 def stat(o, e): e = np.vstack([np.ones(e.shape[1]), e]) # 定数項, 説明変数 return np.linalg.lstsq(e.T, o)[0] # 偏回帰係数 #結果の表示 def out_put(val6): a0, a1, a2, a3, a4, a5, a6, a7, a8 ,a9 = val6 print('算出式') print('z=(6*x^3)+(5*x^2*y)+(0*x*y^2)+(4*x*y)+3*x+2*y+0*x^2+0*y^2+y^3+100') print('答え合わせ') print("a1 = 6 = ", a1) print("a2 = 5 = ", a2) print("a3 = 0 = ", a3) print("a4 = 4 = ", a4) print("a5 = 3 = ", a5) print("a6 = 2 = ", a6) print("a7 = 0 = ", a7) print("a8 = 0 = ", a8) print("a9 = 1 = ", a9) print("b= 100 = ", a0) return def main(): #数字の初期化(1) i = int(0) j = int(0) k = int(0) #データ数のカウント csv_in() #データ数の受け渡し k = csv_in() #データ数を使った数字の初期化(2) val1 = [0]*csv_in() val2 = [0]*csv_in() val3 = [0]*csv_in() val4 = [0]*csv_in() val5 = [0]*csv_in() val6 = [0]*csv_in() #データの入力 val1 = csv_in2() #データの切り分け val4 = val_cut(k,val1) x,y,z = val4 #文字列を削除した分のデータ数補正 k = int(k)-1 #数字の数値化 x = [float(x[i]) for i in range(k)] y = [float(y[i]) for i in range(k)] z = [float(z[i]) for i in range(k)] # リストの初期化 x3=[0]*(k) x2y=[0]*(k) xy2=[0]*(k) y3=[0]*(k) x2=[0]*(k) y2=[0]*(k) xy=[0]*(k) # 変数の計算 for i in range(k): x3[i]=x[i]**3 x2y[i]=x[i]**2*y[i] xy2[i]=x[i]*y[i]**2 y3[i]=y[i]**3 x2[i]=x[i]**2 y2[i]=y[i]**2 xy[i]=x[i]*y[i] # 定数項、偏回帰係数の算出 obj = np.array(z) # 目的変数 exp = np.array([x3, x2y, xy2, xy, x, y, x2, y2, y3]) # 説明変数 a0, a1, a2, a3, a4, a5, a6, a7, a8 ,a9 = stat(obj, exp) #a0,a1, a2, a3, a4, a5, a6, a7, a8 , a9 #b, x**3, x**2*y, x*y**2, x*y, x, y, x**2, y**2 y**3 val5 = a0, a1, a2, a3, a4, a5, a6, a7, a8 ,a9 out_put(val5) return main()
算出式 z=(6*x^3)+(5*x^2*y)+(0*x*y^2)+(4*x*y)+3*x+2*y+0*x^2+0*y^2+y^3+100 答え合わせ a1 = 6 = 5.999999999999969 a2 = 5 = 5.000000000000004 a3 = 0 = 1.7763568394002505e-15 a4 = 4 = 4.000000000000141 a5 = 3 = 2.999999999996261 a6 = 2 = 2.000000000001903 a7 = 0 = 5.88640247656258e-13 a8 = 0 = -3.9968028886505635e-13 a9 = 1 = 1.000000000000011 b= 100 = 100.00000000000243

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

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

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

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

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

guest

回答2

0

ベストアンサー

無駄な変数の初期化はやめましょう。
動作確認できてませんが、ざっと見直してみました。

import csv import numpy as np def read_csv(): """データ入力""" with open('C:/Users/.spyder-py3/191224~/testdataXYZ.csv') as f: return list(csv.reader(f)) def cut_out(csv): """座標データ切り出し""" _, x, y, z = zip(*csv) return x[1:], y[1:], z[1:] def stat(o, e): """定数項、偏回帰係数算出""" e = np.vstack([np.ones(e.shape[1]), e]) # 定数項, 説明変数 return np.linalg.lstsq(e.T, o)[0] # 偏回帰係数 def output(a): """結果表示""" print('算出式') print('z=(6*x^3)+(5*x^2*y)+(0*x*y^2)+(4*x*y)+3*x+2*y+0*x^2+0*y^2+y^3+100') print('答え合わせ') print("a1 = 6 = ", a[1]) print("a2 = 5 = ", a[2]) print("a3 = 0 = ", a[3]) print("a4 = 4 = ", a[4]) print("a5 = 3 = ", a[5]) print("a6 = 2 = ", a[6]) print("a7 = 0 = ", a[7]) print("a8 = 0 = ", a[8]) print("a9 = 1 = ", a[9]) print("b = 100 = ", a[0]) def main(): # データ入力 csv = read_csv() # 座標データ切り出し x, y, z = cut_out(csv) # 数字の数値化 x = list(map(float, x)) y = list(map(float, y)) z = list(map(float, z)) # 変数の計算 def calculate(): for xi, yi in zip(x, y): x3 = xi**3 x2y = xi**2*yi xy2 = xi*yi**2 y3 = yi**3 x2 = xi**2 y2 = yi**2 xy = xi*yi yield x3, x2y, xy2, y3, x2, y2, xy exp = list(zip(*calculate())) # 定数項、偏回帰係数の算出 obj = np.array(z) # 目的変数 exp = np.array(exp) # 説明変数 #a0, a1, a2, a3, a4, a5, a6, a7, a8 , a9 # b, x**3, x**2*y, x*y**2, x*y, x, y, x**2, y**2 y**3 output(stat(obj, exp)) main()

投稿2019/12/30 06:22

編集2019/12/30 07:00
shiracamus

総合スコア5406

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

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

0

python初級者ですが、回答させていただきます。

pythonでは、型の宣言がいらないので、その部分をごそっと削除して実行してみてはいかがでしょうか。
多分うまくいくと思います。

どういう原理かは私はちゃんと理解していないですが、ネットで調べてるといろいろでてきます。

投稿2019/12/30 05:54

surphy

総合スコア101

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問