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

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

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

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

Q&A

解決済

1回答

950閲覧

Pythonで共役勾配法を解くプログラムでlist同士の減算エラーが解決できない

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/07/28 07:54

numpyを用いない共役勾配法の実装を行いたい

Python言語で共役勾配法の計算を行うプログラムの作成中にlist同士の四則演算にてエラーが出て解決ができないため,解決に向けてのアドバイスをいただけたら幸いです.

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

TypeError Traceback (most recent call last) <ipython-input-296-66f345dc49de> in <module> 4 #print(b.shape) 5 ----> 6 ans = cgm(A, b, x0) 7 #print(ans) <ipython-input-295-826ff60a9d2a> in cgm(A, b, x_init) 2 x = x_init 3 ----> 4 r0 = (b - dot(vec,mat)) 5 6 print(r0) TypeError: unsupported operand type(s) for -: 'list' and 'list'

該当のソースコード

python

1import random 2from scipy.io import mminfo,mmread 3 4 5mat = mmread('tub100.mtx').todense() 6 7random.seed(1) 8vec = [[random.randrange(10) for i in range(100)]] 9 10x0 = [(0)*100] 11print(type(x0)) 12 13 14def dot(a,b): 15 16 tmp = [[0]*len(b[0]) for i in range(len(a))] 17 18 for i,v in enumerate(a): 19 for j,u in enumerate(zip(*b)): 20 tmp[i][j] = sum([x*y for x,y in zip(v,u)]) 21 22 return tmp 23print(dot(*[vec,mat])) 24 25 26def cgm(A, b, x_init): 27 x = x_init 28 print(x_init) 29 30 r0 = (b - dot(A,x)) 31 32 print(r0) 33 34 p = r0 35 k = 0 36 for i in range(k < k+1): 37 a = dot(r0.T,r0) / dot(dot(p.T, A),p) 38 x = x + p*a 39 r1 = r0 - dot(A*a, p) 40 if np.linalg.norm(r1) < 1.0e-10: 41 k = k+1 42 return x 43 b = dot(r1.T, r1) / dot(r0.T, r0) 44 p = r1 + b * p 45 r0 = r1 46 k = k+1 47 return x 48 49ans = cgm(A, b, x0) 50print(ans) 51

試したこと

減算でエラーが出ているためsetを用いて計算を行った,
また,list型からarrayやtupleに変換したが解決できなかった.

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

jupyter notebook使用
python version 3.6.5使用
numpyを使用しないで解きたいためndarrayは使わないで解決したいです.

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

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

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

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

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

LouiS0616

2019/07/28 07:59

listの減算について、どのような結果を期待しているのでしょうか。 例えば [3, 1, 4, 1] - [2, 7, 1, 8] の結果は何ですか。
退会済みユーザー

退会済みユーザー

2019/07/28 08:13

ありがとうございます. 上記減算の場合は[1,-6,3,-7]の出力を期待しています.
guest

回答1

0

ベストアンサー

組み込みリストには、各要素をまとめて演算してくれるような機能は無いです。
ただし次のように内包表記を使うとわりあい簡潔には書けます。

Python

1>>> lp = [3, 1, 4, 1] 2>>> le = [2, 7, 1, 8] 3>>> 4>>> lp - le 5Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7TypeError: unsupported operand type(s) for -: 'list' and 'list' 8>>> 9>>> [e1 - e2 for e1, e2 in zip(lp, le)] 10[1, -6, 3, -7]

各演算に対応する特殊メソッドを定義した独自のリストを作っても良いですが、
その場合劣化版ndarrayが爆誕するだけになりそうなので意義は限りなく薄いです。

投稿2019/07/28 08:22

LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2019/07/28 12:41

回答ありがとうございます. 回答して頂いたリスト内表記から自分なりに考えてみたのが下記のものなのですが TypeError: unsupported operand type(s) for -: 'int' and 'list' となり通りません. 最後のprint(r0)以外は出力されるのでリスト内表記の書き方が間違っているのかと思うのですが解決できず困っております. お手数おかけしますがもう少し詳しく教えていただけたら幸いです. def cgm(A, b, x_init): x = x_init print(x_init) d = dot(A,x) print(type(d)) print(d) r0 = [e1 - e2 for e1,e2 in zip(b,d)] print(r0)
LouiS0616

2019/07/28 12:45 編集

dotの返り値がリストのリストだからでしょう。 どのように取り扱いたいかに依ります。
退会済みユーザー

退会済みユーザー

2019/07/28 13:52

質問だらけですみません. dot関数でmatとxに代入されたx_initの内積を計算し,その答えを引数としてcgm関数に渡すことができる?のでしょうか. また,その場合内包表記内にdot(A,x)と直接書き込めるのでしょうか?
LouiS0616

2019/07/28 14:00

具体的にどのような引数をdotに渡したときに、どのような結果が返ってくることを期待しているのですか。 また、実際にそのような動作をしているかどうか確認されましたか。
退会済みユーザー

退会済みユーザー

2019/07/28 14:31

例ですがmat=[[1,2],[3,4]] vec=[5,6]という引数を渡した時に行列ベクトル積である[17,39]を結果として返して,その結果をcgm関数のdot部分で使用したいと考えています. dot関数は動いているのですがcgm関数に答えを渡す方法が分からないという状態です.
LouiS0616

2019/07/28 15:10 編集

> mat=[[1,2],[3,4]] vec=[5,6]という引数を渡した時に行列ベクトル積である[17,39]を結果として返して 手元で試してみましたが、そのようには動きませんね。 [[1,2],[3,4]] と [[5,6]] を渡すと [[17,39]] が返ってきますが。 dot関数は1行n列の行列を返すので、dot(...)[0] でn長のベクトルにしてやらないといけないのでは。
退会済みユーザー

退会済みユーザー

2019/07/28 15:16

r0 = [e1 - e2 for e1,e2 in zip(b,(dot(A,x)[0]))]としたところ下記のエラーとなりました. NameError Traceback (most recent call last) <ipython-input-69-672020a5e70c> in <module> 1 #print(b.shape) ----> 2 ans = cgm(A,b,x0) 3 #print(ans) NameError: name 'A' is not defined
LouiS0616

2019/07/28 15:24

そのエラーは全く別件では。
退会済みユーザー

退会済みユーザー

2019/07/28 15:34

何度もすみませんでした. 質問部分が無事解決し次のエラーが出ていただけでした. ベストアンサーとさせていただきます.ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問