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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Q&A

解決済

3回答

1665閲覧

pythonを用いてcsvデータを出力する

mdshiba2

総合スコア21

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

0グッド

0クリップ

投稿2018/12/20 02:17

編集2018/12/20 02:47

前提・実現したいこと

python 初心者です.
下記のプログラムに出てくる関数のxとzとthetaの値をcsvデータとして取り出したいです.
宜しくお願い致します.

自作コード

Python

1 2import numpy as np 3import matplotlib.pyplot as plt 4from sympy import * 5 6init_printing() 7 8plt.grid(True) 9plt.xlabel('$x$', fontsize=16) 10plt.ylabel('$theta$', fontsize=16) 11 12#縦横比1:1 13plt.gca().set_aspect('equal', adjustable='box') 14 15x = Symbol('x') 16R=5.460 17k=-0.727 18A=-0.00746 19B=0.000127 20C=-1.75*10**(-6) 21D=1.08*10**(-8) 22E=9.58*10**(-11) 23c=1/R 24 25# 計算式 26z =c*x**2/(1+(1-(1+k)*c**2*x**2)**(1/2))+A*x**2+B*x**4+C*x**6+D*x**8+E*x**10 27 28prime_z = Derivative(z, x).doit() 29 30a = Symbol('a') 31z_a = z.subs(x, a) # f(a) 32prime_z_a = prime_z.subs(x, a) # f'(a) 33tangent = prime_z_a * (x - a) + z_a # 点 (a, f(a)) の接線 34normal = (-1 / prime_z_a) * (x - a) + z_a # 点 (a, f(a)) の法線 35theta = deg(atan(-1 / prime_z_a)) # 法線の角度 36 37xs = np.arange(0.01, 6.3, 0.01) 38thetas = np.array([theta.subs(a, t) for t in xs]) 39zs = np.array([z.subs(a, u) for u in xs]) 40# 横軸の変数。縦軸の変数。 41plt.plot(x, z) 42# 描画実行 43plt.show() 44 45#csvデータ取得 46np.savetxt("x,z,theta of points.csv", np.vstack([x, zs, thetas]).T, delimiter=",")

xが変化した時の z,thetaの値をcsvデータとして取り出したいです.

###エラー

Traceback (most recent call last): File "C:/Users/owner/Desktop/aaa.py", line 47, in <module> plt.plot(x, z) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\pyplot.py", line 2813, in plot is not None else {}), **kwargs) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\__init__.py", line 1810, in inner return func(ax, *args, **kwargs) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axes\_axes.py", line 1612, in plot self.add_line(line) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axes\_base.py", line 1895, in add_line self._update_line_limits(line) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\axes\_base.py", line 1917, in _update_line_limits path = line.get_path() File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\lines.py", line 945, in get_path self.recache() File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\lines.py", line 640, in recache x = _to_unmasked_float_array(xconv).ravel() File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\matplotlib\cbook\__init__.py", line 1365, in _to_unmasked_float_array return np.asarray(x, float) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\numeric.py", line 501, in asarray return array(a, dtype, copy=False, order=order) File "C:\Users\owner\AppData\Local\Programs\Python\Python36\lib\site-packages\sympy\core\expr.py", line 256, in __float__ raise TypeError("can't convert expression to float") TypeError: can't convert expression to float

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

python3.6を使用しています.

解決方法がわかっていないので,ご協力お願い致します.

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

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

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

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

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

kunai

2018/12/20 02:41

エラーの中に何が悪いか書いてあリますが、ご自分でエラーメッセージを読んで、その対応をしてみてから、それでも上手くいかない場合に「こう書かれているのでこうやって見たけど、こういう事で上手くいかない」と質問してください。
mdshiba2

2018/12/26 02:06

ご回答ありがとうございます. 以後,そのように質問をさせていただきたいと思います.
guest

回答3

0

ベストアンサー

小さな違和感を一つずつ片付けていく必要があります。

段階1

Python

Traceback (most recent call last):
File "C:/Users/owner/Desktop/aaa.py", line 47, in <module>
plt.plot(x, z)
...
TypeError: can't convert expression to float

気付いてほしいことその1
csvに保存するときではなく、グラフを描画するときにエラーが出ていること。

気付いてほしいことその2
エラーメッセージの内容から察するに、『式』が残ってしまっていること。

以上の点を踏まえると、次の部分がおかしいことが分かります。

Python

x = Symbol('x')
z =cx2/(1+(1-(1+k)*c2x2)(1/2))+Ax**2+Bx4+C*x6+Dx**8+Ex**10
...
xs = np.arange(0.01, 6.3, 0.01)
zs = np.array([z.subs(a, u) for u in xs])
...

横軸の変数。縦軸の変数。

plt.plot(x, z)

plt.plot(x, z) ではなく plt.plot(xs, zs) ですね。

段階2

以上の点を修正して実行しても、エラーが残ります。

Python

1Traceback (most recent call last): 2 File ".py", line 40, in <module> 3 plt.plot(xs, zs) 4 ... 5TypeError: can't convert expression to float

やっぱりsympyの式が残っているようです。
もう一回コードを追ってみましょう。

Python

z =cx2/(1+(1-(1+k)*c2x2)(1/2))+Ax**2+Bx4+C*x6+Dx**8+Ex**10
...
a = Symbol('a')
z_a = z.subs(x, a) # f(a)
...
zs = np.array([z.subs(a, u) for u in xs])

横軸の変数。縦軸の変数。

plt.plot(xs, zs)

せっかく用意した z_a はどこに?
次のように書き換えれば良いことに気付きます。

Python

1zs = np.array([z_a.subs(a, u) for u in xs])

段階3

そうすると、状況が変わります。
グラフは正常に表示されるようになり、それを閉じたときにエラーが発生します。

Python

1Traceback (most recent call last): 2 File ".py", line 45, in <module> 3 np.savetxt("x,z,theta of points.csv", np.vstack([x, zs, thetas]).T, delimiter=",") 4 ... 5ValueError: all the input array dimensions except for the concatenation axis must match exactly

相変らず怪しいのは x ですね。
これはsympyシンボルであってnumpyアレイではありません。

次のように置き換えてみます。

Python

1np.savetxt("x,z,theta of points.csv", np.vstack([xs, zs, thetas]).T, delimiter=",")

私の環境では、これでエラーを吐くことなく実行できました。

投稿2018/12/20 03:25

編集2018/12/20 05:17
LouiS0616

総合スコア35660

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

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

mdshiba2

2018/12/26 02:10

ご回答ありがとうございます. とても丁寧な説明ありがとうございました! わからないことをすべて丸投げにせず,以上の様にステップを踏んで考える癖をつけていきたいと思います.本当にありがとうございました!
guest

0

エラーメッセージ:" return array(a, dtype, copy=False, order=order)
ComplexWarning: Casting complex values to real discards the imaginary part"
[直訳] 複素数に関する警告:複素数を実数に型変換(キャスト)したので、虚数部分が取り除かれました。

自作コードに、"return array(a, dtype, copy=False, order=order)"の行が見当たりませんので、エラー発生個所が判りませんが、エラーメッセージの内容から
・array関数の第1引数か第2引数の型は実数である。
・引数に使った変数(aまたはdtype、もしくは両方)に型が複素数のものが含まれていて、それをarray関数の実数型である引数のところに使ってしまった。
というのが、エラーに至った原因であることがわかります。

複素数は実数部と虚数部をもちますので、それを1次元(例えば縦軸の値)に表すことはできません。
それをグラフに表示しようとする場合には、
・実数部の値を使う
・虚数部の値を使う
・絶対値(√(実数部の二乗 + 虚数部の二乗))を使う
というような回避方法を使います。

もしも、実数部の値を使ってグラフを描こうとしているのなら、望んだ結果が得られているはずなので警告を無視するのが一番簡単です。

警告を出なくする方法:
[array関数の第1引数が実数であり、変数aが複素数である場合]

return array(a, dtype, copy=False, order=order)

return array(a.real, dtype, copy=False, order=order)

と修正する。 
第1引数を、aの実数部(a.real)にしているので、型が実数同士で合う。

投稿2018/12/20 03:08

coco_bauer

総合スコア6915

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

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

coco_bauer

2018/12/20 03:12

回答を書いている間に質問の内容が変わったみたいですが、エラーメッセージは同じですか??
mdshiba2

2018/12/26 02:12

ご回答ありがとうございます. お返事遅くなり申し訳ございません. 解決いたしました.お世話になりました.
guest

0

csvデータでは文字コードでエラーが起こる可能性が高いので、

python 文字コード 判定

とでもクグッてみて下さい。

投稿2018/12/20 02:59

stdio

総合スコア3307

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

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

LouiS0616

2018/12/20 03:30

吐き出そうとしているのはascii文字ですし、エラーメッセージからも関連のものは読み取れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問