HOWTO · Python

IndexError: スカラー変数への無効なインデックスを修正する

NumPy でスカラーを再び添字アクセスしたときの IndexError を診断して修正します。

このページの内容

IndexError: invalid index to scalar variable は、添字アクセスがすでにスカラーを返し、次の [...] がそのスカラーを再び添字アクセスしようとすることを示します。NumPy では ndimshape、選択した値を確認します。

配列と選択した値を確認する

1 次元 NumPy 配列では位置は一つです。values[0] は 1 要素配列ではなく NumPy スカラーなので、values[0][1] は失敗します。

import numpy as np

values = np.array([1, 2, 3, 4, 5])
selected = values[0]

print(values.ndim, values.shape)
print(type(selected).__name__)
print(values[3])

Output:

1 (5,)
int64
4

スカラーの具体的なクラスは異なることがありますが、selected に次元が残っていない点が重要です。

エラーを再現して 1 次元配列を修正する

最初の添字は 1 を選択するため、二つ目は無効です。値が必要なら余分な添字を削除し、配列が必要ならスライスを使います。

import numpy as np

values = np.array([1, 2, 3, 4, 5])

try:
    print(values[0][1])
except IndexError as error:
    print(error)

print(values[0])
print(values[0:2])

Output:

invalid index to scalar variable.
1
[1 2]

values[0] はスカラー、values[0:2] は 1 次元配列を返します。

2 次元 NumPy 配列を添字アクセスする

2 次元配列には行と列があり、grid[row, column] はその意図を明確にします。

import numpy as np

grid = np.array([[1, 2, 3], [4, 5, 6]])

print(grid.ndim, grid.shape)
print(grid[1, 2])
print(grid[1][2])

Output:

2 (2, 3)
6
6

どちらも 6 を返しますが、三つ目の添字はそのスカラーを再びアクセスしようとします。

スカラーの添字アクセスと範囲外エラーを区別する

values[9] は存在しない要素を要求します。values[0][1] は有効な要素に到達した後、それをコンテナーとして扱います。

array.ndimarray.shape を出力し、長い式を中間変数に分けてください。NumPy の添字アクセススカラーのリファレンスも参照できます。