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

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

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

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

Q&A

解決済

1回答

1334閲覧

for文の作り方ついて

bof

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2017/08/20 00:06

編集2017/08/21 08:15

ソースコード

for i, (classId, data_path) in enumerate(test_set): for k in range(84): print("value:", rat_lav[84-k][0], "k:", k, "test.i:", i) if i==rat_lav[84-k][1] : l = rat_lav[84-k][2] #print("l:",l, "value:", rat_lav[84-k][0], "k:", k, "test.i:", i) if countz + counto + counts==5: #print("l:",l, "value:", rat_lav[84-k][0], "k:", k, "test.i:", i) className = {"0": "airplane", "1": "ferry", "2": "laptop"} actual = "???" if countz > counto and countz > counts: actual = className["0"] print("countz:", countz, "counto:", counto, "counts:", counts) elif countz < counto and counts < counto: actual = className["1"] print("countz:", countz, "counto:", counto, "counts:", counts) else: actual = className["2"] print("countz:", countz, "counto:", counto, "counts:", counts) result = "" if actual == "???": result = " => unknown." elif className[classId] == actual: result = " => success!!" success = success + 1 else: result = " => fail" fail = fail + 1 print("expected: ", className[classId], ", actual: ", actual, result) #j=j+1 countz = 0 counto = 0 counts = 0 elif l<29: countz = countz + 1 elif l<57: cuonto = counto + 1 else: counts = counts + 1

へたくそなコードですいません。
要するに

for i in range(84): for k in range(84): if i==a[84-k][1]: if 条件式 ⓵表示するための式 elif 条件式 else 条件式

pythonで実現したいことをC++で表現した場合

for( i; i<84; i++){ for(k; k<84; k++){ if 条件式(i==a[84-k][1]){ if 条件式 { } ⓵表示するための式 else if 条件式{ }else 条件式{ } } }

上記のようなコードを書いて、(i=0,k=0)→(i=0,k=1)・・・(i=1,k=0)→(i=1,k=1)の順にループして、⓵を順に表示したいのですが,for i中のfor kのループが終わった後にfor i=i+1へのループに行かないのですが、どうしたらよいのでしょうか?

rat_lav[84-k][1]が全部0になっているのは

for i in range(84): for j in range(84): matcher = matching_hist(histtest[i:i+1, 0:], histrain[j:j+1, 0:]) matcher = float(matcher) #print(matcher) rat_lav.append([matcher, i, j])

この部分が原因になっているのでしょうか?

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

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

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

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

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

matobaa

2017/08/21 02:51

ちょっと質問の意味が分からないです。どのようになることを期待しているところ、実際にはどうなった、という書き方で書いてみてもらえないでしょうか。
LouiS0616

2017/08/21 06:37

どういうルールでループしたいんです?例から法則を見いだせないです。
chelsy7110

2017/08/21 06:42

質問に「break」と書いてあるので何処かにbreak文は無いのでしょうか?「要するに」と書いたコードですと、ループしますとしかいえないと思います。print("i:", i, "k:", k)等のコードを色んな所に埋め込んでどこで動きがおかしくなるのかを確認して見てはどうでしょうか。
LouiS0616

2017/08/21 07:02

追加されたコードはC++として解釈できませんし、新たな情報が何ら呈示されていません。
bof

2017/08/21 07:11

すいません。C++を直したのですが、間違いがあるかもしれません
LouiS0616

2017/08/21 07:18

まだちょっと変ですが、C++の質問じゃないのであんまり気にしなくていいですよ。
LouiS0616

2017/08/21 07:19

どうして『for i中のfor kのループが終わった後にfor i=i+1へのループに行かない』と判断されたのでしょう?
bof

2017/08/21 07:27

二つ目のif文の中にiを表示する printを書いたのですが、i=0だけk=84個分printされてi=1以降がprintされなかったからです。
LouiS0616

2017/08/21 07:28

if文がtrueになっていないのでは?if文に入る前にそのprint文を置いてみてください。
chelsy7110

2017/08/21 07:30

二つ目のifの中に入っていないだけだと思います。if countz + counto + counts == 5:がtrueにならないのでしょう。一番最初はcountz, counto, countsの初期化のコードがありましたが、気づいたら消えてました。動作させているコードでも初期化のコードは消したのでしょうか?
bof

2017/08/21 07:33

すいません。シンプルにしようと思って消してしまいました。自分で動作しているコードでは初期化のコードは消していません
bof

2017/08/21 07:33

if文の外にprintおいてやってみます
chelsy7110

2017/08/21 07:36

現在動作させているコードに戻してください。消した部分が原因だった場合誰も回答できなくなってしまいます。
bof

2017/08/21 07:36

無知申し訳ないのですが、if文がtrueになっていない。というのはどういう意味ですか?お教えいただけますでしょうか
chelsy7110

2017/08/21 07:38

すみません。自分の書き方が悪かったです。countz + counto + counts == 5 これが成り立たないのでifの中に入っていないんだろうと言うことです。
LouiS0616

2017/08/21 07:38

正確に言えば、『if文の条件式がtrueになっていない』ですね。chelsyさんが『ifの中に入っていないだけ』と言ったのと趣旨は同じです。
bof

2017/08/21 07:46

申し訳ございません。2つ目のforのすぐ下にprintをおいたら、一つ目のループは回っていることがわかりました。
chelsy7110

2017/08/21 07:48

i=0でk=84個文printされたとコメントでありますよね?rat_lav[84-k][1]が全部0な気がします。そうすると、i==rat_lav[84-k][1]の条件がi = 0のとき以外常にfalseになります
chelsy7110

2017/08/21 07:52

申し訳ありません。勘違いです。
bof

2017/08/21 07:52

すいません。rat_lav[84-k][1]が全部0だと思われたのは、ソースコードのどの部分からか教えていただけますか?
LouiS0616

2017/08/21 07:55

if i==rat_lav[84-k][1]:という行は、私も不思議に思います。rat_lavとは何の略なんでしょう?また、どのような理由ではじく必要があるのでしょう?
bof

2017/08/21 07:59

rat_lavは[[float, int, int], [float, int, int]・・・]のリストで rat_lav[84-k][1]は画像分類におけるtest画像の番号が入っています。rat_lav[][2]は学習画像の番号で、rat_lav[0]は対応する学習画像とtest画像の類似度です
bof

2017/08/21 08:04

今、ここに記載したコードの前段階で、rat_lav[][0]を昇順にしました。if i==rat_lav[84-k][1]のiはtest画像の番号としてるので、i==rat_lav[84-k][1]をkの順に探すと、類似度の大きなものが順にわかるので、その対応する学習画像番号rat_lav[84-k][2]をlに与えてます
LouiS0616

2017/08/21 08:04

[1]が推定ラベル、[2]が実際のラベル、[0]が確信度ってことでしょうか?
bof

2017/08/21 08:06

そのとおりです
bof

2017/08/21 08:07

今printで確認したところrat_lav[84-k][1]が全部0になってました
chelsy7110

2017/08/21 08:19

勘違いじゃなかったですね。混乱させてしまい申し訳ありません。そう推測した理由ですが、i=0で84回printされたとのことでしたので、printされるにはi==rat_lav[84-k][1] がtrueにならなければいけません。i=0で84回printされてますので、rat_lav[84-k][1]が全て0なのかなと推測した次第です。]
PineMatsu

2017/08/21 08:36

まさかとは思いますが、ソースコード1行目の「for i, (classId, data_path) in enumerate(test_set):」ですけど、test_setは2個以上のリストになっているのですよね?1つしかない場合は i=0 で終わってしまうので。
chelsy7110

2017/08/21 08:37

rat_lavの作り方が原因ですね。rat_lavの要素数が84*84になっています…
bof

2017/08/21 08:48

すいません。まだプログラミング言語に対する知識が足りず、rat_lavのつくりをどう修正したら良いのかわかりません。お教えいただけますか
guest

回答1

0

ベストアンサー

だんだんぼんやりと原因が見えてきたので、ちょいとまとめます。

for文の外部ループが動作しない
forブロック内のif文によって弾かれていることが原因でしたね。

なぜiが0でないとき、if文の条件が常にfalseになるか
chelsy7110様の指摘の通り、rat_lavの値がおかしいことが原因でした。

rat_lavとはなにか
私なりの言葉でまとめさせていただくと。
・ [1]... 推定したラベル
・ [2]... 実際のラベル
・ [0]... 確信度(パーセンテージ?)
機械学習による画像分類のコードのうち、精度や再現率を評価する部分だったんですね。

なぜrat_lavの値が全て0か

Python

1for i in range(84): 2 for j in range(84): 3 matcher = matching_hist(histtest[i:i+1, 0:], histrain[j:j+1, 0:]) 4 matcher = float(matcher) 5 #print(matcher) 6 rat_lav.append([matcher, i, j])

追記されたコードを見ると、二重ループの最深部にappendが置かれていることがわかります。
ループは84×84回実行されますから、rat_lavの要素数は7056です。
そしてその[1]の内訳は...
**最初の84要素は0。次の84要素は1。さらに次の84要素は2。**です。

ご提示のコードでは、次のように要素を参照していますね。

Python

1if i==rat_lav[84-k][1] :

このときkの値は0~83ですので、『最初の84要素』しか常に見ていないことになります。

  • 追記

kが0のときは、『次の84要素』を参照しています。
要素の指定は84-kではなく83-kとすべきです。

結論
rat_lavの定義と、使い方に齟齬が生じています。

修正の方針
定義部は、次のようにすればよいと思います。(動作検証していません)

Python

1rat_lav = [] 2for i in range(84): 3 tmp = [] 4 for j in range(84): 5 matcher = matching_hist(histtest[i:i+1, 0:], histrain[j:j+1, 0:]) 6 matcher = float(matcher) 7 tmp.append((matcher, j)) 8 9 rat_lav.append(tmp)

ついでに最深部のリストをタプルに変更しました。

利用部については、そもそも最初のif文は必要ないのかな?と思いました。
正しくコードが組めているなら、常に真になるはずでしょうから。
参照するときは、rat_lav[i][83-k][1]といったような書き方になるでしょう。

投稿2017/08/21 08:44

編集2017/08/21 09:06
LouiS0616

総合スコア35660

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

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

LouiS0616

2017/08/21 08:46

あ、修正依頼の方で解決してた。 原因究明の横取りのような形になってしまいました... chelsy7110様、すみません。
chelsy7110

2017/08/21 08:53 編集

いえいえ、まとめて頂いてありがとうございます。 自分でもどう収拾をつけるか迷ってたので。
chelsy7110

2017/08/21 08:53

ただrat_lav[83-k]に変えないといろいろズレそうですねw
LouiS0616

2017/08/21 08:53

確かに、最初だけ『次の84要素』を見ていますね。修正します。
bof

2017/08/21 09:06

LouiS0616さん、chelsy7110さんどうもありがとうございました。自分でいくら考えてもわからなかったので、非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問