実現したいこと
x_initial.csvは以下のようなファイルです。
1
1
1
1
1
y.csv
5
26
10
R.csvは以下のようなファイルです。
1 0 0 0 0
0 3 4 0 2
0 0 0 5 0
「該当のソースコード」の34行目~61行目(疎行列での計算1)では望みの結果を得ることができました。39~41行目に示してある通り、ucsrは行ベクトルです。
ucsrを(xcsr、ycsrと同様に)列ベクトルで出力したいと思い、63~81行目、疎行列での計算2を書きました。34行目に対応するのが63行目、46行目に対応するのが75行目となっています。疎行列での計算2がうまく回らないので、どなたかコードを直していただけないでしょうか。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "〇〇〇\testCV464-2.py", line 78, in <module> ucsr = ucsr + c2*Icsr[i] ~~~~~^~~~~~~~~~~~ File "〇〇〇\sparse\_base.py", line 529, in __add__ raise ValueError("inconsistent shapes") ValueError: inconsistent shapes
該当のソースコード
python
1import numpy as np 2import pandas as pd 3from scipy.sparse import csr_matrix 4 5rows = 3 6I = np.eye(rows) 7 8rows = 3 9cols = 5 10 11R = pd.read_csv("R.csv",header=None).values.tolist() 12x = pd.read_csv("x_initial.csv",header=None).values.tolist() 13y = pd.read_csv("y.csv",header=None).values.tolist() 14 15Icsr = csr_matrix(I) 16Rcsr = csr_matrix(R) 17xcsr = csr_matrix(x) 18ycsr = csr_matrix(y) 19 20print(xcsr) 21#(0, 0) 1 22#(1, 0) 1 23#(2, 0) 1 24#(3, 0) 1 25#(4, 0) 1 26print('') 27print(ycsr) 28#(0, 0) 5 29#(1, 0) 26 30#(2, 0) 10 31print('') 32 33############疎行列での計算1 34u = [1e-6 for i in range(rows)] 35ucsr = csr_matrix(u) 36 37print(ucsr) 38#(0, 0) 1e-06 39#(0, 1) 1e-06 40#(0, 2) 1e-06 41 42for i in range(0,rows,1): 43 if i==0: 44 print('check1'+'\t'+str(ycsr[i]-np.inner(Rcsr[i], xcsr))) #check1 (0, 0) 4.0 45 print('check2'+'\t'+str(ucsr.T[i]))#check2 (0, 0) 1e-06 46 c1 = (ycsr[i]-np.inner(Rcsr[i], xcsr))-ucsr.T[i] 47 print(c1) 48 #(0, 0) 3.999999 49 #(0, 0) 16.999999 50 #(0, 0) 4.999999 51 ucsr = ucsr + c1*Icsr[i] 52 53print('') 54print(ucsr) 55# (0, 0) 4.0 56# (0, 1) 17.0 57# (0, 2) 5.0 58 59print('') 60print('') 61 62############疎行列での計算2 63u = [[1e-6 for j in range(1)] for i in range(rows)] 64ucsr = csr_matrix(u) 65 66print(ucsr) 67#(0, 0) 1e-06 68#(1, 0) 1e-06 69#(2, 0) 1e-06 70 71for i in range(0,rows,1): 72 if i==0: 73 print('check3'+'\t'+str(ycsr[i]-np.inner(Rcsr[i], xcsr)))# (0, 0) 4 74 print('check4'+'\t'+str(ucsr[i]))#check4 (0, 0) 1e-06 75 c2 = (ycsr[i]-np.inner(Rcsr[i], xcsr))-ucsr[i] 76 print(c2) 77 # (0, 0) 3.999999 78 ucsr = ucsr + c2*Icsr[i] 79 80print(ucsr)
試したこと
xとyが列ベクトル、uが行ベクトルのときにうまくいって、x, y, uすべて列ベクトルのときにうまくいかない理由がよく分かりませんでした。x, y, uすべて列ベクトルの方が自然な場合のような気がします。
疎行列を使わないコードは以下の通りです。
python
1import numpy as np 2import pandas as pd 3 4rows = 3 5I = np.eye(rows) 6 7R = pd.read_csv("R.csv",header=None).values.tolist() 8x = pd.read_csv("x_initial.csv",header=None).values.tolist() 9y = pd.read_csv("y.csv",header=None).values.tolist() 10 11u = [1e-6 for i in range(rows)] 12for i in range(0,rows,1): 13 c = (y[i]-np.dot(R[i],x))-u[i] 14 15 for l in range(0,rows,1): 16 u[l] = u[l] + c*I[i][l] 17 18print(u)#[array([4.]), array([17.]), array([5.])]

回答2件
あなたの回答
tips
プレビュー