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

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

ただいまの
回答率

90.52%

  • Python

    7929questions

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

  • Python 3.x

    6342questions

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

Python 辞書型のvalueに対して極大値のindexを求めたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 667

ehu

score 24

 実現したいこと

辞書型のvalueに対して極大値のindexを求めたいです。しかし、IndexError: tuple index out of rangeが出てきてしまいます。極大値の計算にはScipyライブラリを使用しています。
よろしくお願いします。

 自分のコード

from scipy import signal
--------------------//省略
        # ピーク値のインデックスを取得
        maxids = signal.argrelmax(np.array(counted_hsv_dic.values()))  # 最大値


counted_hsv_dicの中身がこちらになります。

{0: 744999, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 0, 26: 0, 27: 0, 28: 0, 29: 0, 30: 0, 31: 0, 32: 0, 33: 0, 34: 0, 35: 0, 36: 0, 37: 0, 38: 0, 39: 0, 40: 0, 41: 0, 42: 0, 43: 0, 44: 0, 45: 0, 46: 0, 47: 0, 48: 0, 49: 0, 50: 0, 51: 0, 52: 0, 53: 0, 54: 0, 55: 0, 56: 0, 57: 0, 58: 0, 59: 0, 60: 0, 61: 0, 62: 0, 63: 0, 64: 0, 65: 0, 66: 0, 67: 0, 68: 0, 69: 0, 70: 0, 71: 0, 72: 0, 73: 0, 74: 0, 75: 0, 76: 0, 77: 0, 78: 0, 79: 0, 80: 0, 81: 0, 82: 0, 83: 0, 84: 0, 85: 0, 86: 0, 87: 0, 88: 0, 89: 0, 90: 0, 91: 0, 92: 0, 93: 0, 94: 0, 95: 0, 96: 0, 97: 0, 98: 0, 99: 0, 100: 0, 101: 0, 102: 0, 103: 0, 104: 0, 105: 0, 106: 0, 107: 0, 108: 0, 109: 0, 110: 0, 111: 0, 112: 0, 113: 0, 114: 1, 115: 0, 116: 2, 117: 11, 118: 23, 119: 59, 120: 174, 121: 629, 122: 1665, 123: 5628, 124: 14147, 125: 23158, 126: 22497, 127: 14592, 128: 2528, 129: 860, 130: 568, 131: 521, 132: 433, 133: 423, 134: 356, 135: 334, 136: 387, 137: 343, 138: 320, 139: 361, 140: 340, 141: 302, 142: 296, 143: 255, 144: 313, 145: 288, 146: 303, 147: 313, 148: 291, 149: 356, 150: 753, 151: 740, 152: 764, 153: 1580, 154: 3682, 155: 8998, 156: 2973, 157: 3652, 158: 5494, 159: 4159, 160: 7356, 161: 13008, 162: 16607, 163: 9255, 164: 3008, 165: 1074, 166: 302, 167: 93, 168: 19, 169: 6, 170: 0, 171: 1, 172: 0, 173: 0, 174: 0, 175: 0, 176: 0, 177: 0, 178: 0, 179: 0, 180: 0, 181: 0, 182: 0, 183: 0, 184: 0, 185: 0, 186: 0, 187: 0, 188: 0, 189: 0, 190: 0, 191: 0, 192: 0, 193: 0, 194: 0, 195: 0, 196: 0, 197: 0, 198: 0, 199: 0, 200: 0, 201: 0, 202: 0, 203: 0, 204: 0, 205: 0, 206: 0, 207: 0, 208: 0, 209: 0, 210: 0, 211: 0, 212: 0, 213: 0, 214: 0, 215: 0, 216: 0, 217: 0, 218: 0, 219: 0, 220: 0, 221: 0, 222: 0, 223: 0, 224: 0, 225: 0, 226: 0, 227: 0, 228: 0, 229: 0, 230: 0, 231: 0, 232: 0, 233: 0, 234: 0, 235: 0, 236: 0, 237: 0, 238: 0, 239: 0, 240: 0, 241: 0, 242: 0, 243: 0, 244: 0, 245: 0, 246: 0, 247: 0, 248: 0, 249: 0, 250: 0, 251: 0, 252: 0, 253: 0, 254: 0}

 エラーコード

File ---, line 79, in color_detection
    maxids = signal.argrelmax(np.array(counted_hsv_dic.values()))  # 最大値
  File ---, line 177, in argrelmax
    return argrelextrema(data, np.greater, axis, order, mode)
  File ---, line 232, in argrelextrema
    axis, order, mode)
  File ---, line 60, in _boolrelextrema
    datalen = data.shape[axis]
IndexError: tuple index out of range
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+4

signal.argrelmaxに渡しているnp.arrayの情報を覗いてみましょう。

my_array = np.array(counted_hsv_dic.values())
print(my_array, my_array.shape, my_array.dtype)
# maxids = signal.argrelmax(my_array)

"""出力
dict_values([744999, 0, ...中略... 0, 0]) () object
"""

object型、詳しく言うとdict_value型の単一の要素が格納されているようです。


dict.values()リファレンスを見てみると、次のように書いてあります。

辞書の値の新しいビューを返します。ビューオブジェクトのドキュメント を参照してください。

返り値はリストではないのです。
よって、次のように明示的にリストに変換すれば、エラーは解消されます。

maxids = signal.argrelmax(
    np.array(list(counted_hsv_dic.values()))
)
print(maxids)

"""出力
(array([114, 125, 136, 139, 144, 147, 150, 155, 158, 162, 171], dtype=int64),)
"""

...しかし。辞書型は通常、要素の順序を指定できません。
ですので、結果がインデックスの形で返されても、本当に正しく参照できるのかは微妙です。※

ご提示のサンプルデータを見てみると、keyは単に0~254の整数のようですね。
このような場合は、最初からリスト形式のコンテナを用いることをお勧めします。

counted_hsv_dicの形式を変えたくない/られないときは、次のようにすれば良いでしょう。

array = np.array([counted_hsv_dic[i] for i in range(255)])

...もっと簡単な方法があるかも。


※私の環境では、counted_hsv_dicの順序は崩れませんでした。
が、言語仕様上それを信頼していいのかは、ちょっと自信がないです。

collections.OrderedDictとかもありますが...
リストで対応できる場合はそうした方が手間がかからないかと思います。

ついでに

同様のエラーを起こしてみた。

>>> a = np.array([1])
>>> a
array([1])
>>> a.shape
(1,)
>>> a.shape[0]
1
>>> b = np.array(1)
>>> b
array(1)
>>> b.shape
()
>>> b.shape[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/29 13:37

    リファレンスにある iter(dictview) の項を見ると、元のdictを途中で変更しない限り .keys() と .values() の順番は一致すると書いてあります。なので得られたインデックスは安心して使えると思います。

    キャンセル

  • 2017/09/29 13:46

    コメントありがとうございます。
    私もその記述は読んだのですが、少し腑に落ちない点があったのです。

    > その要素の順序は完全に一致します。これにより、 (value, key) の対を zip() で作成できます
    これは、次のどちらとして解釈すればよいのでしょう?
    ・アイテムの順序が完全に変わらないことが保証される
    ・zipしたときに辞書が復元できることだけが保証される

    キャンセル

  • 2017/09/29 13:56

    もし後者であったら、
    『list(values())から得られたインデックス』と、『counted_hsv_dic[key]で指定すべきキー』が完全に対応するとは思えないのです。

    ---パターン1---
    list(counted_hsv_dic.keys())[
    ....get_hoge_index(
    ........list(counted_hsv_dic.values())
    ....)
    ]

    ---パターン2---
    counted_hsv_dic[
    ...get_hoge_index(
    ......list(counted_hsv_dic.values())
    ...)
    ]

    パターン1とパターン2の結果が異なる恐れはないのでしょうか。
    このような懸念がありましたので、『自信がない』と書いてしまいました。

    キャンセル

  • 2017/09/29 14:24 編集

    さきほどのコメントはパターン1を想定してました。曖昧な表現でしたすみません。
    パターン2は、いま counted_hsv_dic のキーがたまたま list のインデックスっぽいのでややこしいですが、次のような仮定が必要だと思います。

    counted_hsv_dic.values()
    の i 番目の value に対応する key、つまり
    counted_hsv_dic.keys()
    の i 番目の key が i である。

    しかしリファレンスの iter(dictview) の項には「キーと値のリストはある任意の順序でイテレートされます」とあるのでこの仮定は使えないということになります。

    キャンセル

  • 2017/09/29 14:43

    パターン1だったら、正しく動作しそうですね。
    ただ、何しろ記述が煩雑になるので... 最初からリストで処理した方がいい、という結論にしてしまいました。
    実際のところ、パターン2はどれくらい信頼できるのでしょうね。
    気が向いたら、質問を立ててみようかと思います。

    疑問を明文化してまとめる良い機会となりました。
    コメントありがとうございます、これからもよろしくお願いいたします。

    キャンセル

  • 2017/09/29 22:18

    型が違うとこのようなエラーになってしまうようですね。ご回答ありがとうございました。最初からリスト形式のコンテナを使用しようと思います。

    キャンセル

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

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

関連した質問

  • 解決済

    文字列を比較して配列に格納できない

    ans配列の要素の文字列の最初の文字がlinesの要素の最初の文字と一致するならlinesの2番目の要素('A'/'B'/'C'/'D')をline_alpha配列に格納する、とい

  • 解決済

    pythonのスライスについて

    a = b[:,0] このようなコードがあったとき、どのようなことがおこなわれますか? bはこのコードがなりたつ何かだとすると なにだったら成り立ちますか? すみません、間

  • 解決済

    files配列が空の時のtry-catch文をどうかけばいいのか

    files配列が空の時のtry-catch文をどうかけばいいのでしょうか? アップロードされたファイルを保存する時のコードを @csrf_exempt def upload_s

  • 解決済

    list index out of range のエラー修正

    コード import numpy as np import chainer from chainer import cuda,Function,report,training,ut

  • 解決済

    pythonで手形状分類器を作っています

    前提・実現したいこと python初心者です。手形状分類器を作っています。このようなプログラムを組みましたがエラーが出てしまいます。 解決方法を教えてください。 発生している問

  • 解決済

    LSTM | tuple index out of range の原因がわかりません

    実現したいこと RNNを使用して数字列の順番を予測させたいと考えています 入力する数字列は[3,4,1,4,2,0,3,2]のような形式で、長さは10〜14程度、全100セットあり

  • 解決済

    tupleとlistの違い

    tupleとlistの違いとして、 ① tupleは変更不可だから緯度のような不変のものに使える ② listよりもパフォーマンスが良い(実行速度が少し早い) とwebに書いていま

  • 解決済

    Python 2次元配列について

     前提・実現したいこと (前提)gurunaviのapiを使用 出力すると2次元配列になっているのですがprint(line[a][b])というようにしても、全く出力されない点

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

  • Python

    7929questions

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

  • Python 3.x

    6342questions

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