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

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

ただいまの
回答率

90.35%

  • Python 3.x

    11185questions

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

for文の作り方ついて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 506

bof

score 12

ソースコード

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])


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • PineMatsu

    2017/08/21 17:36

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

    キャンセル

  • chelsy7110

    2017/08/21 17:37

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

    キャンセル

  • bof

    2017/08/21 17:48

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

なぜrat_lavの値が全て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])

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

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

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

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

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

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

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

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

    rat_lav.append(tmp)

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/21 17:53

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

    キャンセル

  • 2017/08/21 17:53

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

    キャンセル

  • 2017/08/21 18:06

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    11185questions

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