HOWTO · Python

IndexError: 스칼라 변수에 대한 잘못된 인덱스 수정

NumPy 스칼라를 다시 인덱싱할 때 발생하는 IndexError를 진단하고 수정합니다.

이 페이지의 내용

IndexError: invalid index to scalar variable은 인덱싱이 이미 스칼라 하나를 반환했고 다음 [...]가 그 스칼라를 다시 인덱싱하려 한다는 뜻입니다. NumPy에서는 ndim, shape, 선택한 값을 확인하세요.

배열과 선택한 값 검사하기

1차원 NumPy 배열에는 위치 하나가 필요합니다. values[0]은 한 원소 배열이 아니라 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 인덱싱 문서스칼라 참조를 확인할 수 있습니다.