Translate

【numpy】index ○○ is out of bounds for axis ○ with size ○って何のエラー【エラー】

 spyder とかを使ったよくpythonスクリプトを回しているといろんなエラーに出くわしますよね。

甘味もいつもpythonでエラーコードを吐き出しながら、デバックして解析コードを作っていますが、エラーコードは何度起こしてしまってもなかなか覚えられないものです。

甘味は普段forループをよく使っているのですが、最近よく出くわすエラーコードがこちらで、
「index ○○ is out of bounds for axis ○ with size ○」っていうエラーです。

今回は備忘録としてこのエラーが何で起きてしまって、何をしたら解決できるのかについてまとめていきたいと思います。

index ○○ is out of bounds for axis ○ with size ○はnumpyの範囲指定の際のエラー



よく「index ○○ is out of bounds for axis ○ with size ○」のエラーを読み解いていくと、こんなことを言っています。インデックスの範囲として指定した数字は、そのデータの行列の範囲を超えてしまっています。

ニュアンスとしてこんな感じです。つまりは、こちらがnumpyの行列の取り出しの際に指定した値が、実際のデータの範囲を超えてしまっていて、実行できませんよー。ってなことを言っているわけだと理解できました。

英語でつらつらーと書いているので最初は何だかさっぱりわかりませんが、実際に文章よ読み解くと、「index ○○ is out of bounds for axis ○ with size ○」はこういうことを言っているわけですね。

私の場合にはforループで値を指定していた範囲を気づいたら超えてしまっていたらしい。

私のよくあるケースだと、私が良く書くpythonコードだと、あらかじめインデックスとして指定する値のnumpy行列をforループの前の段階で作成しておいて、その後にforループの中で順次、行列の一列目から指定していくといったものをよく書きます。

そのケースの場合には、たいてい、forループの繰り返す回数が間違っていて、本来存在しない行の値を指定しようとしていたといったことが原因として「index ○○ is out of bounds for axis ○ with size ○」のエラーが起こっていたようです。

forループ内で起こっているのであれば、forループの繰り返し回数を確認

「index ○○ is out of bounds for axis ○ with size ○」のエラーがforループの中で起こっているのであると仮定した場合、まず確認するべきは、forループの繰り返し回数を確認するべきだと思います。

私もここのコードを直すことでたいていの場合はうまく動いてくれます。

forループが原因だと突き止める上で、個人的に重要だなーと思うところとしては、forループの何回目で起きているのかを特定するのが大事です。

for i in range.....こんな感じでforループを書くと思いますが、この変数として使用しているiの値がどこで止まっているのかを確認しましょう。たいていの場合には、ループ外でiを使って値を決めている行列の最後の行に相当する場所で止まっている場合が多いと思います。

また途中で止まってしまっている場合であるならば、ループ外の行列そのものが問題であるということが考えられます。

いずれにせよ、「index ○○ is out of bounds for axis ○ with size ○」を解決するためのカギとしてはpythonコードの中でいうところのそこの二点になるといえるでしょう。

forループの行列の範囲指定はエラーが起こりやすい

pythonはforループをインテンドの階層で区切っているので、視覚的にわかりやすいといえますが、はやりpythonといえどforループはエラーが起こりやすい箇所です。今回の「index ○○ is out of bounds for axis ○ with size ○」の他にも、いろんなエラーが起こることが考えられます。

エラーを読み解くカギとしては、forループのどこの回数でエラーを起こしているのか、元データに由来するエラーなのか、回数指定の部分のエラーなのかを見分けて対処することだと思います。

とはいえ、forループは使いこなせれば、pythonスクリプトの見やすさをもちろんのこと、作業効率も圧倒的に向上するため、味方につけて使いこなせるようになるのが、上達への近道のような気がします(甘味は苦手であまり使いこなせているとはいえませんが(笑))。