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

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

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

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

Q&A

解決済

2回答

1283閲覧

numpyを使用しないで転置行列の内積を求める方法および行列の内積の内積の求め方の計算方法について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/07/28 16:53

編集2019/07/29 02:31

numpyを使用しないで共役勾配法の実装を試みていますが途中の式の計算がうまくできず困っている.

numpyを使用しないで共役勾配法の解を算出するプログラムを作っています.
途中の a = float( np.dot(r0.T,r0) / np.dot(np.dot(p.T, A),p) )という計算をnpを使わないで計算したいのですがうまく変えずに困っております.
自分なりに内包表記やzipを使用して試行錯誤はしたのですが,通りません.
アドバイスいただけたら幸いです.

また,みにくいソースかもしれませんがご容赦ください.

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

ValueError Traceback (most recent call last) <ipython-input-173-78082ced4a70> in <module> 1 #print(b.shape) ----> 2 ans = cgm(mat,vec,x0) 3 print(ans) <ipython-input-172-15436a5d72cf> in cgm(A, b, x_init) 14 15 for i in range(k < k+1): ---> 16 d1 = dot(list(map(list,zip(*r0))),r0) 17 print(d1) 18 d2 = dot(dot(list(map(list,zip(*p))),A),p) <ipython-input-170-9fb70407aafc> in dot(a, b) 5 for i,v in enumerate(a): 6 for j,u in enumerate(zip(*b)): ----> 7 tmp[i][j] = sum([x*y for x,y in zip(v,u)]) 8 9 return tmp <ipython-input-170-9fb70407aafc> in <listcomp>(.0) 5 for i,v in enumerate(a): 6 for j,u in enumerate(zip(*b)): ----> 7 tmp[i][j] = sum([x*y for x,y in zip(v,u)]) 8 9 return tmp ~/.pyenv/versions/3.6.5/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other) 218 if isinstance(other, (N.ndarray, list, tuple)) : 219 # This promotes 1-D vectors to row vectors --> 220 return N.dot(self, asmatrix(other)) 221 if isscalar(other) or not hasattr(other, '__rmul__') : 222 return N.dot(self, other) ValueError: shapes (1,48) and (1,48) not aligned: 48 (dim 1) != 1 (dim 0)

該当のソースコード

Python

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

試したこと

a = float( np.dot(r0.T,r0) / np.dot(np.dot(p.T, A),p) )という計算はnumpyを使用しているため下記のようにzipとリスト内包表記を使用したものに変更してみたがエラーは解決できませんでした.
**でくくってあるところの下のコメントa = dot(r0.T,r0) / dot(dot(p.T, A),p)というよな計算を実装したいです.
助言いただけたら幸いです.

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

Python version 3.5.6
jupyter notebook 使用
numpy sympyは使用しないで内積の計算を行いたいためnp.は使用できません.

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

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

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

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

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

meg_

2019/07/29 11:47

numpy.dotとarray.Tを使用しないとのことですので、 ・配列の転置を実行する関数 ・配列の内積を計算する関数   と関数を分けて1ステップずつ実装してみてはいかがでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/29 14:19

質問ありがとうございます. 仰っている事は理解できているのですが,知識,技術共に乏しく基本的なことしかわからず実装に至らないため,書き方のヒントやどういった関数を使用すれば上手くいくか等のアドバイスをお願いできないでしょうか.
meg_

2019/07/30 01:45

内包表記は理解されているということで良いてすか?
guest

回答2

0

ベストアンサー

python

1def tenti(x): 2 return [list(j) for j in [i for i in zip(*x)]] 3 4 5 6def mydot(x, y): 7 8 y = tenti(y) 9 result = [] 10 11 for i in x: 12 subresult = [] 13 for j in y: 14 subresult.append(sum([k * m for k, m in zip(i, j)])) 15 result.append(subresult) 16 return result

コードを簡潔にするためエラー処理は一切入れてません。実装する際には適宜入れてください。

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]

print(mydot(a, b))

[[19, 22], [43, 50]]

a = [[1, 2, 3], [4, 5, 6]]
b = [[1, 4], [2, 5], [3, 6]]

print(mydot(a, b))

[[14, 32], [32, 77]]

投稿2019/07/30 13:31

meg_

総合スコア10579

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

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

退会済みユーザー

退会済みユーザー

2019/08/03 04:25

返信遅くなり申し訳ございません. 教えていただいた書き方で無事うまく出力されました. ありがとうございました.
guest

0

二次元のリストを転置する例

x=[[1,2],[3,4]]
[list(j) for j in [i for i in zip(*x)]]

実行結果:[[1, 3], [2, 4]]

※xは要素数が同じ二次元のリストとする

投稿2019/07/30 02:03

meg_

総合スコア10579

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問