本記事は個人用のメモ書きである。
あくまで、似たようなエラーで引っかかってしまった初学者の方向けの記事になるので、一般的な内容を期待されている方は回れ右をしていただきたい。
事象
今回の発生したエラーは、とある記事通りにコードを実装していた際に発生した次のエラーである。
single_image = pixel_values[1,:].reshape(28, 28)
InvalidIndexError: (1, slice(None, None, None))
このコードでやりたかった処理としては、pixel_valuesというリスト(画像がいっぱい格納されている三次元のイメージ)から、一つ目の画像を引っ張ってこようと1行目のレコードをスライスしようとした形である。
しかし、この初めて見るエラーが出てきたため、面食らってしまった。
原因
こんなことを言うのは「お前いくらなんでもいい加減すぎるだろう」と馬鹿にされそうで憚れるのだが、結論原因はデータ理解の不足である。
pixel_valuesをリスト(或いはnumpy系のやつかな~)という認識でいたのだが、実はこのデータはpandasのデータフレームであった。
「まさかデータの種類も知らずにデータスライスするやつがいるとは。。。」と呆れている人もいるだろうが、現にここにいるのである。
データフレームを直接スライスはできないので、ちゃんとpandasの仕様に合わせたスライスの仕方をすることが解決策となる。
解決策
single_image = pixel_values.iloc[1,:].values.reshape(28, 28)
ここまで書けばもう充分かもしれないが、念のため解決策となるコードも上に記載しておく。
ポイントはilocを使用したデータスライスである。
また、このスライスで取得できるのはデータシリーズのため、直接reshapeができないので、間にしれっとvaluesを挟んでいる。
総括
自分が扱っているデータがどの種類でどんな形で保持されているのか理解する。
当たり前だけど、これを怠らないことが大事である。
(本記事が該当エラーで困惑してしまった人の助けに少しでもなれば幸いである。)