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

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

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

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

Python

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

Q&A

解決済

1回答

750閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2017/09/28 16:30

実現したいこと

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

自分のコード

python

1from scipy import signal 2--------------------//省略 3 # ピーク値のインデックスを取得 4 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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

Python

1my_array = np.array(counted_hsv_dic.values()) 2print(my_array, my_array.shape, my_array.dtype) 3# maxids = signal.argrelmax(my_array) 4 5"""出力 6dict_values([744999, 0, ...中略... 0, 0]) () object 7"""

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


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

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

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

Python

1maxids = signal.argrelmax( 2 np.array(list(counted_hsv_dic.values())) 3) 4print(maxids) 5 6"""出力 7(array([114, 125, 136, 139, 144, 147, 150, 155, 158, 162, 171], dtype=int64),) 8"""

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

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

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

Python

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

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


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

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

ついでに

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

Python

1>>> a = np.array([1]) 2>>> a 3array([1]) 4>>> a.shape 5(1,) 6>>> a.shape[0] 71 8>>> b = np.array(1) 9>>> b 10array(1) 11>>> b.shape 12() 13>>> b.shape[0] 14Traceback (most recent call last): 15 File "<stdin>", line 1, in <module> 16IndexError: tuple index out of range

投稿2017/09/28 17:27

編集2017/09/28 17:36
LouiS0616

総合スコア35660

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

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

karamarimo

2017/09/29 04:37

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

2017/09/29 04:46

コメントありがとうございます。 私もその記述は読んだのですが、少し腑に落ちない点があったのです。 > その要素の順序は完全に一致します。これにより、 (value, key) の対を zip() で作成できます これは、次のどちらとして解釈すればよいのでしょう? ・アイテムの順序が完全に変わらないことが保証される ・zipしたときに辞書が復元できることだけが保証される
LouiS0616

2017/09/29 04: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の結果が異なる恐れはないのでしょうか。 このような懸念がありましたので、『自信がない』と書いてしまいました。
karamarimo

2017/09/29 05:25 編集

さきほどのコメントはパターン1を想定してました。曖昧な表現でしたすみません。 パターン2は、いま counted_hsv_dic のキーがたまたま list のインデックスっぽいのでややこしいですが、次のような仮定が必要だと思います。 counted_hsv_dic.values() の i 番目の value に対応する key、つまり counted_hsv_dic.keys() の i 番目の key が i である。 しかしリファレンスの iter(dictview) の項には「キーと値のリストはある任意の順序でイテレートされます」とあるのでこの仮定は使えないということになります。
LouiS0616

2017/09/29 05:43

パターン1だったら、正しく動作しそうですね。 ただ、何しろ記述が煩雑になるので... 最初からリストで処理した方がいい、という結論にしてしまいました。 実際のところ、パターン2はどれくらい信頼できるのでしょうね。 気が向いたら、質問を立ててみようかと思います。 疑問を明文化してまとめる良い機会となりました。 コメントありがとうございます、これからもよろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2017/09/29 13:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問