質問するログイン新規登録
Python

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

Q&A

解決済

2回答

261閲覧

入力データがすべて列ベクトルのときにコードが回りません

yyicp

総合スコア84

Python

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

1グッド

1クリップ

投稿2025/08/14 05:32

編集2025/08/14 06:02

1

1

実現したいこと

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.])]
melian👍を押しています

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

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

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

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

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

melian

2025/08/14 05:56

shape を合わせればよい、ということであれば転置(transpose)するとよいかもしれません。 ## ucsr = ucsr + c2*Icsr[i] ucsr = ucsr + (c2*Icsr[i]).T ucsr の値は以下の様になりますが、これでよいのかどうかは不明です。 <Compressed Sparse Row sparse matrix of dtype 'float64'     with 3 stored elements and shape (3, 1)> Coords Values (0, 0) 4.0 (1, 0) 17.0 (2, 0) 5.0
yyicp

2025/08/14 06:14

>melian様 ありがとうございます。 78行目を ucsr = ucsr + (c2*Icsr[i]).T にすると、以下のようなエラーが出ますので、75行目にも何らかの修正が必要が気がしますが、いかがでしょうか。 Traceback (most recent call last): File "〇〇〇\testCV464-2.py", line 75, in <module> c2 = (ycsr[i]-np.inner(Rcsr[i], xcsr))-ucsr[i] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ File "〇〇〇\sparse\_base.py", line 548, in __sub__ raise ValueError("inconsistent shapes") ValueError: inconsistent shapes
melian

2025/08/14 06:28 編集

こちらの環境(Python3.13.3, SciPy 1.16.1)では75行目でエラーが発生しないですね。。。
yyicp

2025/08/14 07:06 編集

私の環境は古かったので python 3.13.6 scipy 1.16.1 に上げました。 しかし、同様のエラーが出ます。 「該当のソースコード」をもう一度書きます。 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] ご提案にあるように、78行目だけを ucsr = ucsr + (c2*Icsr[i]).T とするだけではなく、 その前にある75行目にも何らかの書き換えが必要だと言われていると思うのですが、いかがでしょうか。
melian

2025/08/14 07:12

やはりエラーにはなりませんね。。。先程は書き忘れたのですが Numpy のバージョンはどうなっていますか? こちらでは 2.3.2 を使用しています。
yyicp

2025/08/14 07:21

numpyは2.3.2です。
yyicp

2025/08/14 07:29

47行目の出力が3行(48~50行目)あるのに対し、76行目の出力が1行(77行目)しかないのが少し気になっています。
melian

2025/08/14 07:42

76行目の出力が1行というのはこちらも同様です。以下、こちらで実行した際に表示されるログです。 <Compressed Sparse Row sparse matrix of dtype 'float64' with 1 stored elements and shape (1, 1)> Coords Values (0, 0) 3.999999 <Compressed Sparse Row sparse matrix of dtype 'float64' with 1 stored elements and shape (1, 1)> Coords Values (0, 0) 16.999999 <Compressed Sparse Row sparse matrix of dtype 'float64' with 1 stored elements and shape (1, 1)> Coords Values (0, 0) 4.999999 <Compressed Sparse Row sparse matrix of dtype 'float64' with 3 stored elements and shape (3, 1)> Coords Values (0, 0) 4.0 (1, 0) 17.0 (2, 0) 5.0
yyicp

2025/08/14 07:43 編集

大変申し訳ありません。 確認時の私のコードにミスがありました。 ## ucsr = ucsr + c2*Icsr[i] ucsr = ucsr + (c2*Icsr[i]).T で解決しましたので、回答欄にご記入いただけないでしょうか。
guest

回答2

0

既に解決済みなので,御参考です。

(2次元の)列ベクトルに揃えたいという意図を踏まえると,Icsr[i].reshape((-1, 1)) メソッドを用いて列ベクトルに変形するという方法も考えられます。

なお,Sparse arrays(scipy.sparse) の Note によれば,csr_matrix() の代わりに csr_array() が推奨されていますので,下記の記述例では csr_array() を用いています。また,念のため通常の配列を用いた記述例を先に示しています。

Python

1import numpy as np 2import pandas as pd 3from scipy.sparse import csr_array 4 5rows, cols = 3, 5 6 7I = np.eye(rows) 8R = pd.read_csv('R.csv', header=None, sep=r'\s+').to_numpy() 9x = pd.read_csv('x_initial.csv', header=None).to_numpy() 10y = pd.read_csv('y.csv', header=None).to_numpy() 11u = np.array([[1e-6]] * rows) 12 13for i in range(rows): 14 c = y[i] - R[i] @ x - u[i] 15 u += c * I[i].reshape((-1, 1)) 16 17print(u) 18# [[ 4.] 19# [17.] 20# [ 5.]] 21 22# ---------- 23 24Icsr = csr_array(I) 25Rcsr = csr_array(R) 26xcsr = csr_array(x) 27ycsr = csr_array(y) 28ucsr = csr_array([[1e-6]] * rows) 29 30for i in range(rows): 31 ccsr = ycsr[i] - Rcsr[i] @ xcsr - ucsr[i] 32 ucsr += ccsr * Icsr[i].reshape((-1, 1)) 33 34# print(ucsr) 35print(ucsr.toarray()) 36# [[ 4.] 37# [17.] 38# [ 5.]]

投稿2025/08/15 10:03

編集2025/08/18 09:30
little_street

総合スコア479

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

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

yyicp

2025/08/18 01:32

ご回答ありがとうございます。 お返事遅くなって申し訳ありません。 私の環境では以下のようなエラーが出ます。 Traceback (most recent call last): File "〇〇〇\testCV464-2.py", line 14, in <module> c = y[i] - R[i] @ x - u[i] ~~~~~^~~ ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 5 is different from 1)
little_street

2025/08/18 03:51 編集

行列の積(R[i] @ x)でミスマッチのエラーが生じているようです。R がうまく読み込めたか確かめて(print(R))みてください。なお,R.csv の区切り文字は質問の記載に合わせてスペースにしていますが,もしカンマであれば sep=r'\s+' は削除してください。
yyicp

2025/08/18 02:06

sep=r'\s+' を削除して解決しました。 どうもありがとうございました。
guest

0

ベストアンサー

shape を合わせればよい、ということであれば転置(transpose)するとよいかと思います。

python

1## ucsr = ucsr + c2*Icsr[i] 2ucsr = ucsr + (c2*Icsr[i]).T

最終的な ucsr の値は以下になります。

<Compressed Sparse Row sparse matrix of dtype 'float64' with 3 stored elements and shape (3, 1)> Coords Values (0, 0) 4.0 (1, 0) 17.0 (2, 0) 5.0

投稿2025/08/14 07:46

melian

総合スコア21391

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

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

yyicp

2025/08/14 07:49

できました。 どうもありがとうございました。 私のミスでお手数をお掛けして申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問