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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

1回答

12829閲覧

Python3 エラー'tuple' object has no attribute 'shape'

HaruKasu

総合スコア6

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2020/01/17 05:58

前提・実現したいこと

python初心者です。
惑星とその周りを楕円運動する衛星の軌道を、微分方程式を解くことでプロットしようとしています。

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

動径をr、系の慣性軸と衛星惑星をむすぶ直線がなす角をfとしてひとまず値を得ることが出来ましたが、それが本当に楕円軌道を描いているのか(正しく数値計算出来ているか)を確認するためにデカルト座標にプロットしたいのですが、変換のサンプルコードを用いても座標データの代入が間違っているのか、エラーが出ます。

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-16-c7b0c13ef6ac> in <module> 81 position = (u_list[:,0], u_list[:,1]) 82 ---> 83 polar2cartesian(position) <ipython-input-16-c7b0c13ef6ac> in polar2cartesian(position) 72 def polar2cartesian(position): 73 ---> 74 num = position.shape[0] 75 newposition = np.empty([num,2], dtype=np.float64) 76 newposition[:,0] = position[:,0]*np.cos(position[:,1]) AttributeError: 'tuple' object has no attribute 'shape'

該当のソースコード

import math import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt t_min = 0.0 t_max = 10.0 N = 1001 n = 2*np.pi a = 1.0 e = 0.1 k = n*a*pow(1-e*e, -1/2) def func(u, t, k, n, a, e): r = u[0] f = u[1] x1 = u[2] # γ x2 = u[3] # dγ/dt drdt = k*e*math.sin(f) dfdt = k*math.cos(f)/r dx1dt = x2 dx2dt = -0.02*n*n*pow(a/r, 3)*math.sin(2*x1-2*f) return ([drdt, dfdt, dx1dt, dx2dt]) t = np.linspace(t_min, t_max, N) # 時間刻み u0 = [1.0, 0.0, 0.0, 0.0] # r,f,γ,dγ/dtの初期値 u_list = odeint(func, u0, t, args=(k, n, a, e)) #print(u_list) # 可視化 def plot1(x, y): fig = plt.figure() sol = fig.add_subplot(1,1,1) sol.set_xlabel("γ", fontsize=20, fontname='selif') sol.set_ylabel("dγ/dt", fontsize=20, fontname='selif') sol.tick_params(axis='both', length=10, which='major') sol.tick_params(axis='both', length=5, which='minor') sol.set_xlim([0.0, np.pi]) sol.set_ylim([-1.0, 2.0]) sol.minorticks_on() sol.plot(x, y, 'b-', markersize=5) fig.tight_layout() plt.show() plot1(u_list[:,2], u_list[:,3]) def polar2cartesian(position): num = position.shape[0] newposition = np.empty([num,2], dtype=np.float64) newposition[:,0] = position[:,0]*np.cos(position[:,1]) newposition[:,1] = position[:,0]*np.sin(position[:,1]) return newposition position = (u_list[:,0], u_list[:,1]) polar2cartesian(position)

試したこと

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

Python3をAnacondaで使っています。

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

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

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

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

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

guest

回答1

0

python

1position = (u_list[:,0], u_list[:,1])

position は DataFrame が2つ入っている tuple です。

python

1num = position.shape[0]

position の tuple に対して shape メソッド/メンバ にアクセスしていますが、tuple にはありません。
もしかして、tupleの最初の要素に対して position[0].shape としたかったのでしょうか?

投稿2020/01/17 06:03

編集2020/01/17 06:04
shiracamus

総合スコア5406

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

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

HaruKasu

2020/01/17 06:29

迅速なご回答ありがとうございます。御指摘頂いたことについてですが、 1「tupleに無い」というのは、何がでしょう?理解力が無くて申し訳ありません…。 2 この「def polar2certesian(position):」以下のコードはあるサイトに載っていたものをそのまま2次元にしただけのものでした。そこで御指摘の通り[0]の位置を書き直したところ、今度は以下のエラーが出ました。 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-57e58cc9ff72> in <module> 81 position = (u_list[:,0], u_list[:,1]) 82 ---> 83 polar2cartesian(position) <ipython-input-17-57e58cc9ff72> in polar2cartesian(position) 73 74 num = position[0].shape ---> 75 newposition = np.empty([num,2], dtype=np.float64) 76 newposition[:,0] = position[:,0]*np.cos(position[:,1]) 77 newposition[:,1] = position[:,0]*np.sin(position[:,1]) TypeError: 'tuple' object cannot be interpreted as an integer これはやはり1に書いたtupleやshapeに関わる問題が解消されていないことに起因するものでしょうか?質問だらけになってしまいすみません。
shiracamus

2020/01/17 07:00 編集

tuple は ("abc", "def") のようなデータです。 以下のように実行したときの違いはわかりますか? 行頭の `>>> ` は 対話型PYthonインタープリタの入力プロンプトです。 >>> position = ("abc", "def") >>> position.uppper()[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'uppper' >>> position[0].upper() 'ABC' >>> position[0] 'abc' >>> position[1] 'def'
HaruKasu

2020/01/17 06:49

前者は今私が陥っているエラー状態で、後者は成功したパターンですね。positionとして定義(?)したtupleという形式の要素の集まりで、その0にあたるもの、つまり一つ目の要素”abc”に対してupper関数を作用したところabcを大文字でABCと表示することに成功した、という理解で大丈夫でしょうか。
HaruKasu

2020/01/17 06:51

つまり私は今のところ、shape関数の作用範囲を動径要素rのデータしか扱えない状態にしてしまっているということでしょうか。
shiracamus

2020/01/17 06:58 編集

そうなりますね。 position 変数には、 u_list[:,0] というデータと u_list[:,1] というデータの2要素のタプルデータになっています。 shape を取りたいのは u_list[:,0] ですか? u_list[:,1] ですか? 両方ですか? num = position[0].shape とすれば num = u_list[:,0].shape を実行したのと同等です。 num = position[1].shape とすれば num = u_list[:,1].shape を実行したのと同等です。
HaruKasu

2020/01/17 07:46

なるほど理解しました! そして改めて疑問に思うのですが、私は(r, f)のデータを(x, y)に変換したいだけなのですが、そもそも要素数をはじき出すshape関数がなぜ必要なのでしょう?この変換におけるshape関数の役割がわかれば、u_list[:,0]かu_list[:,1]かまたはその両方に作用させるべきか判断できると思います。
shiracamus

2020/01/17 07:50

shapeを指定したのはご自身ではないのですか?
HaruKasu

2020/01/17 08:19

極座標を直交座標に変換するコードについて調べたときに参照したあるサイトに、サンプルコードとして載っているのをそのまま2次元に直して使わせてもらったのです。
HaruKasu

2020/01/17 08:28

empty関数について調べていたら、「shapeを引数として渡す」と書いてあるのを見落としていました。このサンプルコードではempty関数を用いているので、だから必要だったんですね。すみません、お騒がせしました。
shiracamus

2020/01/17 08:28

2次元に直したときにタプルにしたのですね? であれば num1, num2 = position[0].shape, position[1].shape のように2個のnum変数を作り出せばいいのではないですか?
HaruKasu

2020/01/17 09:09

その2つのnum変数をどのように扱うかを教えて頂けると幸いです…!!
shiracamus

2020/01/17 09:34 編集

参考にしたサイトは 1 次元だから、長さは1個だったんですよね? 2次元だと xの長さと yの長さの 2個いるのではなのですか? 変数名を num_x, num_y にすれば分かりやすいかもしれません。 変数の値がいくつか、printして調べてみましょう。
HaruKasu

2020/01/17 16:37

返事が遅くなってごめんなさい。あれからご指摘通りnum変数を2個にしてみたり色々試したのですが、どうにも毎回エラーが出て(殆どがtupleについてでした)、あのサンプルコードを改変するという方向性を諦めてしまいました…。ここまで助言、お付き合い下さり誠にありがとうございました!!!もっとPython勉強します!! そこで、以下のように書き直したところ、なんと値が得られました! def cartesian(x, y): x = [] y = [] x = u_list[:,0]*np.cos(u_list[:,1]) y = u_list[:,0]*np.sin(u_list[:,1]) return [x, y] cartesian(u_list[:,0], u_list[:,1]) print(x, y) plt.plot(x, y) 実行結果がこれです。 [1.00000000e+00 9.95473962e-01 9.82124993e-01 ... 4.38903187e-10 4.35296601e-10 4.31724112e-10] [ 0. 0.10020052 0.19861179 ... 10.95917815 10.96922853 10.9792789 ] これをプロットしたところ全然楕円になっていませんでした。これが楕円になっていれば、衛星軌道計算が正しいということの確認になるのですが…。 ここからは、なぜこれが楕円にならないのか、どうすれば楕円になるのかを考えていきます。 それでも、shiracamus様とのやり取りの中で、新しい知識も沢山得ることが出来ました。本当に感謝しています。一方的に切ってしまうことになってすみません。今後もまた質問を投稿することもあると思いますので、宜しければまたご助言をお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問