HOWTO · Python
IndexError: スカラー変数への無効なインデックスを修正する
NumPy でスカラーを再び添字アクセスしたときの IndexError を診断して修正します。
このページの内容
IndexError: invalid index to scalar variable は、添字アクセスがすでにスカラーを返し、次の [...] がそのスカラーを再び添字アクセスしようとすることを示します。NumPy では ndim、shape、選択した値を確認します。
配列と選択した値を確認する
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.ndim と array.shape を出力し、長い式を中間変数に分けてください。NumPy の添字アクセス とスカラーのリファレンスも参照できます。