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

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

ただいまの
回答率

87.37%

pyhton配列のスライスのエラー<too many indices for array>

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,106

score 18

前提・実現したいこと

pythonでscikitのデータセットから取り出したリストをndarrayに変換してスライスで一部を取り出そうと思っているのですがエラーが発生してしまいうまくできません。解決策としてどうすれば良いのでしょうか。

発生している問題・エラーメッセージ

IndexError                                Traceback (most recent call last)

<ipython-input-1-b90196b600e7> in <module>()
      4 digits = datasets.load_digits()
      5 digits = np.array(digits)
----> 6 c = digits[2:4,2:4,:]
      7 print(c)

IndexError: too many indices for array
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pydev\pydevd.py", line 1758, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pydev\pydevd.py", line 1752, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pydev\pydevd.py", line 1147, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/noriy/PycharmProjects/hello1/main.py", line 13, in <module>
    c = digits[2:4,2:4,:]
IndexError: too many indices for array

arrayの要素数が多すぎるのでしょうか?
なおdatasetsのdigitsの概要は以下のようになります

Classes 10
Samples per class ~180
Samples total 1797
Dimensionality 64
Features integers 0-16

該当のソースコード

import numpy as np
from sklearn import datasets

digits = datasets.load_digits()
digits = np.array(digits)
c = digits[2:4,2:4,:]
print(c)

試したこと

以下のように.imagesをつけることにより指定の文字を取り出すことにより配列の大きさを小さくしたらなおりました。なのでアレイの要素数が多すぎたのでしょうか?上のエラーを避けるにはやはり要素を小さくカットしてそこからスライスをしてあとからくっつけるというようなことをしなければならないのいでしょうか?

digits = datasets.load_digits()
digits = np.array(digits.images[1])#<----ここを変更
c = digits[2:4,2:4]#データも二次元になるので二次元に
print(c)

補足情報

python3.6
numpy
sckit-learn

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

sklearn.datasets.load_digits — scikit-learn 0.21.2 documentation

Dictionary-like object, the interesting attributes are: ‘data’,
the data to learn, ‘images’, the images corresponding to each sample, ‘target’, the classification labels for each sample, ‘target_names’,
the meaning of the labels, and ‘DESCR’, the full description of the dataset.

load_digits() の返り値は公式リファレンスに記載の通り、画像やラベルなどの情報が辞書形式で格納されているオブジェクトです。
なので、画像を取り出したい場合はまず digits.images で画像一覧を取得してください。
これは形状が (サンプル数, 8, 8) の numpy 配列になります。

サンプルの一部をスライスで取り出したい場合、digits.images[スライスの記述] で取り出してください。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets

digits = datasets.load_digits()

imgs = digits.images
labels = digits.target
print(imgs.shape, labels.shape)  # (1797, 8, 8) (1797,)

# 最初の25枚を描画する。
first_25_imgs = imgs[:25]  # 先頭25枚

fig = plt.figure(figsize=(7, 7), facecolor="w")
for i in range(25):
    ax = fig.add_subplot(5, 5, i + 1)
    ax.imshow(first_25_imgs[i], cmap="gray")
    ax.set_axis_off()
plt.show()

イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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