ソースコード
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])
この部分が原因になっているのでしょうか?
ちょっと質問の意味が分からないです。どのようになることを期待しているところ、実際にはどうなった、という書き方で書いてみてもらえないでしょうか。
どういうルールでループしたいんです?例から法則を見いだせないです。
質問に「break」と書いてあるので何処かにbreak文は無いのでしょうか?「要するに」と書いたコードですと、ループしますとしかいえないと思います。print("i:", i, "k:", k)等のコードを色んな所に埋め込んでどこで動きがおかしくなるのかを確認して見てはどうでしょうか。
追加されたコードはC++として解釈できませんし、新たな情報が何ら呈示されていません。
すいません。C++を直したのですが、間違いがあるかもしれません
まだちょっと変ですが、C++の質問じゃないのであんまり気にしなくていいですよ。
どうして『for i中のfor kのループが終わった後にfor i=i+1へのループに行かない』と判断されたのでしょう?
二つ目のif文の中にiを表示する printを書いたのですが、i=0だけk=84個分printされてi=1以降がprintされなかったからです。
if文がtrueになっていないのでは?if文に入る前にそのprint文を置いてみてください。
二つ目のifの中に入っていないだけだと思います。if countz + counto + counts == 5:がtrueにならないのでしょう。一番最初はcountz, counto, countsの初期化のコードがありましたが、気づいたら消えてました。動作させているコードでも初期化のコードは消したのでしょうか?
すいません。シンプルにしようと思って消してしまいました。自分で動作しているコードでは初期化のコードは消していません
if文の外にprintおいてやってみます
現在動作させているコードに戻してください。消した部分が原因だった場合誰も回答できなくなってしまいます。
無知申し訳ないのですが、if文がtrueになっていない。というのはどういう意味ですか?お教えいただけますでしょうか
すみません。自分の書き方が悪かったです。countz + counto + counts == 5 これが成り立たないのでifの中に入っていないんだろうと言うことです。
正確に言えば、『if文の条件式がtrueになっていない』ですね。chelsyさんが『ifの中に入っていないだけ』と言ったのと趣旨は同じです。
申し訳ございません。2つ目のforのすぐ下にprintをおいたら、一つ目のループは回っていることがわかりました。
i=0でk=84個文printされたとコメントでありますよね?rat_lav[84-k][1]が全部0な気がします。そうすると、i==rat_lav[84-k][1]の条件がi = 0のとき以外常にfalseになります
申し訳ありません。勘違いです。
すいません。rat_lav[84-k][1]が全部0だと思われたのは、ソースコードのどの部分からか教えていただけますか?
if i==rat_lav[84-k][1]:という行は、私も不思議に思います。rat_lavとは何の略なんでしょう?また、どのような理由ではじく必要があるのでしょう?
rat_lavは[[float, int, int], [float, int, int]・・・]のリストで rat_lav[84-k][1]は画像分類におけるtest画像の番号が入っています。rat_lav[][2]は学習画像の番号で、rat_lav[0]は対応する学習画像とtest画像の類似度です
今、ここに記載したコードの前段階で、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に与えてます
[1]が推定ラベル、[2]が実際のラベル、[0]が確信度ってことでしょうか?
そのとおりです
今printで確認したところrat_lav[84-k][1]が全部0になってました
勘違いじゃなかったですね。混乱させてしまい申し訳ありません。そう推測した理由ですが、i=0で84回printされたとのことでしたので、printされるにはi==rat_lav[84-k][1] がtrueにならなければいけません。i=0で84回printされてますので、rat_lav[84-k][1]が全て0なのかなと推測した次第です。]
まさかとは思いますが、ソースコード1行目の「for i, (classId, data_path) in enumerate(test_set):」ですけど、test_setは2個以上のリストになっているのですよね?1つしかない場合は i=0 で終わってしまうので。
rat_lavの作り方が原因ですね。rat_lavの要素数が84*84になっています…
すいません。まだプログラミング言語に対する知識が足りず、rat_lavのつくりをどう修正したら良いのかわかりません。お教えいただけますか
回答1件
あなたの回答
tips
プレビュー