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

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

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

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

Python

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

Q&A

解決済

1回答

1936閲覧

Pythonでリスト同士の減算をしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/08/03 14:36

編集2019/08/04 03:40

リスト同士の減算を行いたい

最終的にはansに共役勾配法の答えを格納するプログラムを作成しています.
その過程でリスト同士の減算を行いたいのですがエラーが解決できなくて困っております.
リスト同士の減算が推奨されていないのは理解していますが何かいい方法はないでしょうか.
よろしくお願いします.

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

TypeError Traceback (most recent call last) <ipython-input-215-ef022784c545> in <module> 11 #print(mydot(a,b)) 12 ---> 13 ans = cg(a, b, x0) 14 #print(ans) <ipython-input-214-3f7771f15856> in cg(a, b, x_init) 2 x = x_init 3 ----> 4 r0 = (b - (mydot(A,x))) #r0 = (b - np.dot(A,x)) 5 p = r0 6 k = 0 TypeError: unsupported operand type(s) for -: 'list' and 'list'

該当のソースコード

Python

1from scipy.io import mmread 2import random 3import numpy as np 4 5def tenti(x): 6 return [list(j) for j in [i for i in zip(*x)]] 7 8def mydot(x, y): 9 10 y = tenti(y) 11 result = [] 12 13 for i in x: 14 subresult = [] 15 for j in y: 16 subresult.append(sum([k * m for k, m in zip(i, j)])) 17 result.append(subresult) 18 return result 19 20def cg(A, b, x0): 21 x = x0 22 23 r0 = (b - (mydot(A,x))) 24 25 #r0 = [e1 - e2 for e1, e2 in zip(b, (mydot(A,x)))] 26 27 #r2 = set(b) - set(mydot(A,x)) 28 #r0 = list(r2) 29 30 r0 = 31 p = r0 32 k = 0 33 for i in range(k < k+1): 34 a = (mydot((tenti(r0)),r0)) / (mydot(mydot((tenti(p)), A),p)) 35 x = x + p * a 36 r1 = r0 - (mydot(A*a, p)) 37 if np.linalg.norm(r1) < 1.0e-10: 38 k = k+1 39 return x 40 b = (mydot((tenti(r1)), r1)) / (mydot(tenti(r0)), r0) 41 p = r1 + b * p 42 r0 = r1 43 k = k+1 44 return x 45 46 47A = mmread('bcsstm01.mtx').todense() 48 49random.seed(1) 50b = [[random.randrange(10) for i in range(48)]] 51 52x0 = [[0]*48] 53 54ans = cg(A, b, x0)

試したこと

setを用いてリストを処理しようと試みましたが違うエラーが出てしまいうまくいきませんでした.
何か違う方法でアドバイスいただければ幸いです.

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

Python3.6.5使用
jupyter notebookで書いています
mmreadで読み込んでいるファイルは48*48の疎行列でmatrix marketから使用しているものです.

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

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

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

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

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

quickquip

2019/08/03 14:47

[3, 2, 1, 1] - [1, 2, 2, 2] に対して欲しい結果は [3]か[3, 1]か[2, 0, -1, -1]か、どれでしょう?
退会済みユーザー

退会済みユーザー

2019/08/03 15:41

質問ありがとうございます. [2,0,-1,-1]を出力としたいです.
Zuishin

2019/08/03 22:31

リスト同士の減算が推奨されていないと理解しているというのはどういう意味ですか? どのような理解でしょう?
退会済みユーザー

退会済みユーザー

2019/08/04 00:24

hayataka2049様,質問ありがとうございます. 記載し忘れていましたが,リスト内包表記も試しました. しかし,上記と同じエラーでした. 解決案があればお願いいたします.
退会済みユーザー

退会済みユーザー

2019/08/04 00:30

Zuishin様,質問ありがとうございます. エラー文の日本語訳が list - listはサポートされていないのがlist型といった意味だと解釈しております. 例えると a = [1,2] - [3,4] はできないということでしたので内包表記とsetを試しましたがうまくいきませんでした.
Zuishin

2019/08/04 00:48

サポートと推奨は違います。サポートされてないというのは、この場合は「標準では実装されていないので自分でやってください」の意味です。 前と同じ質問なので、そのままでは前と同じ意図の回答になります。何をどう試したか具体的なコードを書けば、前の回答でうまくいかなかった部分がわかり、具体的な回答がもらえるでしょう。
meg_

2019/08/04 01:49

リスト内包表記を試したとのことですので、試したコードを追記してもらえませんか?
退会済みユーザー

退会済みユーザー

2019/08/04 01:56

Zuishin様,アドバイスありがとうございます. 該当ソースコード部分にコメントで試したものを書き込みました. よろしくお願いします.
退会済みユーザー

退会済みユーザー

2019/08/04 01:59

meg_様コメントありがとうございます. 該当ソースコード内にコメントで試した内包表記を書き込みました. 発生しているエラーは TypeError: unsupported operand type(s) for -: 'list' and 'list' となります.
coco_bauer

2019/08/04 02:11

listとlistとの間の引き算("-")はサポートされていないというのですから、引き算の演算子("-")をオーバーロードして list - list という演算ができるようにすれば解決します。 無ければ作る‼ そのために、演算子をオーバーロードする機能が用意されているのです。 がんばってください。 「Python 演算子 オーバーロード」でWeb検索すると、参考になる記事が見つかりますよ。
退会済みユーザー

退会済みユーザー

2019/08/04 03:37

coco_bauer様,コメントありがとうございます. 検索して試してみます.
guest

回答1

0

ベストアンサー

追記いただいた下記方法ですと、zipの戻り値が一次元のリストであれば上手くいきます。

r0 = [e1 - e2 for e1, e2 in zip(b, (mydot(A,x)))]

想定されているのは多次元配列(リスト)同士の減算(各要素同士の引き算)だと思いますので、工夫が必要です。
独自の関数を定義してください。

※r0 = (b - (mydot(A,x))) の中の変数Aは何を指していますか?

投稿2019/08/04 02:55

meg_

総合スコア10579

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

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

退会済みユーザー

退会済みユーザー

2019/08/04 03:36

回答ありがとうございます. 考えてみます. すみませんタイプミスです.A = mmread('bcsstm01.mtx').todense()が正しいので修正します.
退会済みユーザー

退会済みユーザー

2019/08/04 12:31

いただいた関数を元に試行錯誤した結果減算自体はできているようなのですが,欲しい結果[[2, 9, 1, 4, 1, 7, 7, 7, 6, 3, 1, 7, ・・・ という答えが[[[matrix([[2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]]), matrix([[9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9.]]),・・・ といったように大量に出力されてしまいました. お手数おかけしますが追加のヒントをいただけないでしょうか. また,関数は下記のように変更しています. def genzan(x,y): result = [] for i in x: subresult = [] for j in y: subresult.append([e1 - e2 for e1,e2 in zip(i,j)]) result.append(subresult) return result
meg_

2019/08/04 13:14

上記関数 genzan ですと、行列Xと行列Yの各行同士の減算をしています。 2×2の行列だとすると、Xの1行目とYの1行目・Xの1行目とYの2行目・Xの2行目とYの1行目・Xの2行目とYの2行目と4回計算します。そのため出力も4個(2×2)となります。 Xのn行目とYのn行目同士を単純に引き算したいなら、 for i ,j in zip(x, y): result.append([e1 - e2 for e1,e2 in zip(i,j)]) で良いです。
退会済みユーザー

退会済みユーザー

2019/08/04 15:06

定数をgenzanにのみ投げたところ通ったのでgenzanの問題ではなく,mydotが戻り値を二次元で返しているため同じ数値が多量に格納されていたみたいです. ありがとうございました.減算問題はうまくいったためベストアンサーにさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問