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

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

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

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

Python

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

Q&A

解決済

2回答

1624閲覧

指定のグラフの曲率半径を算出したい。

S.K12

総合スコア16

NumPy

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

Python

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

0グッド

0クリップ

投稿2020/09/27 12:27

編集2020/09/27 13:02

前提・実現したいこと

下記のグラフの曲率半径をすべて算出したいです。
イメージ説明

最終的にグラフの曲率半径最小位置を求めたいと考えている為、
グラフの端からは端まですべての曲率半径を出力したいです。

該当ソースコード作成時に参考にしたサイトは下記の通りです。
Three Points Circle (Electronic Station) - 3点を通る円の方程式を求める

補足

原因がx,yの配列がnumpyである事だと思うのですが、
numpyではない通常(?)の配列への変換方法がわからず対処出来ていません。

また、冒頭の

x = np.array([[930.49552541], [930.50241252], [930.50936 ], [930.51581285], [930.52178554],... #長いので省略 y=np.array([[0.00434942], [0.00434728], [0.00434605], [0.00434515], [0.00434443],... #長いので省略

のコードを変えずに対処出来ないでしょうか。

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

TypeError Traceback (most recent call last) <ipython-input-20-62b58ee62a61> in <module> 257 Y3 = y[row_num] 258 --> 259 checkio("(X,Y),(X2,Y2),(X3,Y3)") 260 R = r 261 <ipython-input-20-62b58ee62a61> in checkio(data) 237 (x1, y1), (x2, y2), (x3, y3) = eval(data) 238 (x0, y0), r = get_circle_center_and_radius(x1, y1, x2, y2, x3, y3) --> 239 return make_equation(x0, y0, r) 240 241 <ipython-input-20-62b58ee62a61> in make_equation(x, y, r) 232 return name if num == '0' else '({0}{1}{2})'.format(name, sign, num) 233 --> 234 return "{}^2+{}^2={}^2".format(make_part('x', x), make_part('y', y), format_float(r)) 235 236 def checkio(data): <ipython-input-20-62b58ee62a61> in make_part(name, value) 228 229 def make_part(name, value): --> 230 num = format_float(abs(value)) 231 sign = '-' if value > 0 else '+' 232 return name if num == '0' else '({0}{1}{2})'.format(name, sign, num) <ipython-input-20-62b58ee62a61> in format_float(f) 222 223 def format_float(f): --> 224 result = str(round(f, 2)) 225 result = remove_suffix(result, '.00') 226 result = remove_suffix(result, '.0') TypeError: type numpy.ndarray doesn't define __round__ method

該当のソースコード

Python

1import math 2import numpy as np 3 4x =np.array([[930.49552541], 5 [930.50241252], 6 [930.50936 ], 7 [930.51581285], 8 [930.52178554], 9 [930.52813743], 10 [930.53590557], 11 [930.54574973], 12 [930.55803645], 13 [930.57266836], 14 [930.58935564], 15 [930.60826951], 16 [930.62884869], 17 [930.64961964], 18 [930.66947954], 19 [930.68803344], 20 [930.70490674], 21 [930.7215936 ], 22 [930.73982617], 23 [930.75971803], 24 [930.77935041], 25 [930.79865324], 26 [930.8207072 ], 27 [930.8457263 ], 28 [930.87278812], 29 [930.90082988], 30 [930.92861418], 31 [930.95349711], 32 [930.97389033], 33 [930.99209669], 34 [931.01197425], 35 [931.03358981], 36 [931.05703237], 37 [931.08380651], 38 [931.11410212], 39 [931.14362348], 40 [931.16924592], 41 [931.19070421], 42 [931.20623112], 43 [931.2187767 ], 44 [931.23142849], 45 [931.24739802], 46 [931.26840248], 47 [931.29298588], 48 [931.32298162], 49 [931.35864627], 50 [931.3950254 ], 51 [931.43214055], 52 [931.47362004], 53 [931.51968795], 54 [931.56676231], 55 [931.60902366], 56 [931.64616018], 57 [931.68188711], 58 [931.71813859], 59 [931.75697725], 60 [931.80058173], 61 [931.84915365], 62 [931.89639139], 63 [931.93781723], 64 [931.97537223], 65 [932.01339803], 66 [932.05415833], 67 [932.09774788], 68 [932.13955831], 69 [932.17479712], 70 [932.20562587], 71 [932.23672897], 72 [932.27051968], 73 [932.30707133], 74 [932.3489253 ], 75 [932.39373234], 76 [932.44158594], 77 [932.49513548], 78 [932.55457704], 79 [932.61747775], 80 [932.67859409], 81 [932.7324024 ], 82 [932.77589621], 83 [932.80877703], 84 [932.8363532 ], 85 [932.86130171], 86 [932.88638003], 87 [932.91720118], 88 [932.95670163], 89 [933.00220653], 90 [933.05387947], 91 [933.11478805], 92 [933.1763619 ], 93 [933.22967197], 94 [933.27447892], 95 [933.31963668], 96 [933.37122972], 97 [933.42941259], 98 [933.49435751], 99 [933.56310613], 100 [933.62940727], 101 [933.69638453], 102 [933.77050269], 103 [933.8519677 ]]) 104 105 106y=np.array([[0.00434942], 107 [0.00434728], 108 [0.00434605], 109 [0.00434515], 110 [0.00434443], 111 [0.00434375], 112 [0.00434299], 113 [0.00434213], 114 [0.00434116], 115 [0.00434013], 116 [0.00433905], 117 [0.00433795], 118 [0.00433684], 119 [0.00433581], 120 [0.00433489], 121 [0.00433407], 122 [0.00433336], 123 [0.00433269], 124 [0.00433198], 125 [0.00433124], 126 [0.00433053], 127 [0.00432986], 128 [0.00432912], 129 [0.00432831], 130 [0.00432747], 131 [0.00432662], 132 [0.00432582], 133 [0.00432511], 134 [0.00432455], 135 [0.00432406], 136 [0.00432354], 137 [0.00432298], 138 [0.00432239], 139 [0.00432172], 140 [0.00432099], 141 [0.0043203 ], 142 [0.0043197 ], 143 [0.00431922], 144 [0.00431887], 145 [0.00431859], 146 [0.00431832], 147 [0.00431797], 148 [0.00431752], 149 [0.004317 ], 150 [0.00431637], 151 [0.00431565], 152 [0.00431492], 153 [0.0043142 ], 154 [0.0043134 ], 155 [0.00431254], 156 [0.00431168], 157 [0.00431093], 158 [0.00431027], 159 [0.00430966], 160 [0.00430904], 161 [0.00430839], 162 [0.00430767], 163 [0.00430688], 164 [0.00430613], 165 [0.00430549], 166 [0.00430491], 167 [0.00430433], 168 [0.00430371], 169 [0.00430307], 170 [0.00430246], 171 [0.00430195], 172 [0.00430151], 173 [0.00430107], 174 [0.00430059], 175 [0.00430009], 176 [0.00429951], 177 [0.0042989 ], 178 [0.00429826], 179 [0.00429755], 180 [0.00429678], 181 [0.00429597], 182 [0.0042952 ], 183 [0.00429452], 184 [0.00429399], 185 [0.00429358], 186 [0.00429325], 187 [0.00429295], 188 [0.00429265], 189 [0.00429228], 190 [0.00429181], 191 [0.00429127], 192 [0.00429067], 193 [0.00428997], 194 [0.00428927], 195 [0.00428867], 196 [0.00428817], 197 [0.00428767], 198 [0.00428711], 199 [0.00428648], 200 [0.00428578], 201 [0.00428505], 202 [0.00428436], 203 [0.00428366], 204 [0.0042829 ], 205 [0.00428208]]) 206 207 208#(x1,y1)(x2,y2)(x3,y3)の3点を通る円の中心と半径を取得 209def get_circle_center_and_radius(x1, y1, x2, y2, x3, y3): 210 r = [] 211 d = 2 * ((y1 - y3) * (x1 - x2) - (y1 - y2) * (x1 - x3)) 212 x = ((y1 - y3) * (y1 ** 2 - y2 ** 2 + x1 ** 2 - x2 ** 2) - (y1 - y2) * (y1 ** 2 - y3 ** 2 + x1 ** 2 - x3 ** 2)) / d 213 y = ((x1 - x3) * (x1 ** 2 - x2 ** 2 + y1 ** 2 - y2 ** 2) - (x1 - x2) * (x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2)) / -d 214 r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2) #ここで求めたrを配列Rに格納していきたい 215 return (x, y), r 216 217#上記で算出した円の中心座標と半径より円の方程式の作成 218def checkio(data): 219 (x1, y1), (x2, y2), (x3, y3) = eval(data) 220 (x0, y0), r = get_circle_center_and_radius(x1, y1, x2, y2, x3, y3) 221 return make_equation(x0, y0, r) 222 223 224i = 0 225row_num = i 226R = [] 227while i <= 100 : 228 X = x[row_num] #1つ目の座標 229 Y = y[row_num] 230 231 i = i + 1 232 row_num = i 233 X2 = x[row_num] #2つ目の座標 234 Y2 = y[row_num] 235 236 i = i + 1 237 row_num = i 238 X3 = x[row_num] #3つ目の座標 239 Y3 = y[row_num] 240 241 checkio("(X,Y),(X2,Y2),(X3,Y3)") #上記3点から作られる円の方程式を算出 242 R = r 243 244print(R)

補足情報(FW/ツールのバージョンなど)

windows64bit
Anaconda

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

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

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

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

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

sfdust

2020/09/27 12:36 編集

get_circle_center_and_radius(...) make_equation(x, y, r) checkio(data) 各関数の内容および引数の意味を記載してください。
S.K12

2020/09/27 13:03

ご指摘有難う御座います。該当内容の編集を行いました。
guest

回答2

0

質問の該当のエラーは、

result = str(round(f, 2))

result = str(round(float(f), 2))

にするだけです。
あと、

checkio("(X,Y),(X2,Y2),(X3,Y3)")

r = checkio("(X,Y),(X2,Y2),(X3,Y3)")

とすれば未定義エラーは消えます。

投稿2020/09/27 12:50

編集2020/09/27 13:06
sfdust

総合スコア1135

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

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

0

ベストアンサー

コードの下の方のwhile i <= 100 :の前に以下を挿入すると、xとyに関するエラーは無くなります。

Python

1x = np.ravel(x).tolist() 2y = np.ravel(y).tolist()

ただし、新たに一番下の方のR = rで、rが定義されていない、というエラーが出ます。確かにrはどこにも定義されていないため、こちらの解決方法は、今のコードだけでは分かりません。

投稿2020/09/27 12:41

toast-uz

総合スコア3266

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

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

S.K12

2020/09/27 15:50

御回答有難うございます。 元のエラーは無事に表示されなくなったのでとても助かりました。 rの定義についてはwhile文の中に関数を入れる事で解決したのですが、 出力が想定通りの物ではなかったので、もう少しいじってみてわからないようであればまた別の形で質問させて戴こうと思います。 この度は有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問