728x90
반응형
본 포스팅은 업무 중 발생했던 오류들을 예시를 통해 어떻게 해결을 하는지 작성하고자 합니다.
TypeError: list indices must be integers or slices, not tuple
해당 오류는 list 형식의 데이터를 numpy처럼 사용하고자 했을 때 자주 보게 되는 오류입니다.
아래 예시와 같이 list가 2D 형태이고 첫 번째 축이 아닌 두 번째 이상 축에 인덱싱을 하고자 할 때 발생했습니다.
m = [[0, 4], [1, 0], [2, 2], [3, 3], [4, 1]]
m[:,1]
"""
---------------------------------------------------------------------------
TypeError Traceback (most recent call last) /aidata/lung/WORKSPACE/workspace_s/ncc/inference copy.ipynb Cell 16 in <cell line: 1>()
----> 1 m[:,1]
TypeError: list indices must be integers or slices, not tuple
"""
우선 list는 내부 배열에서 각 요소의 크기가 달라도 되지만, numpy는 각 요소의 크기가 통일돼야 한다는 차이가 있습니다.
따라서 list는 서로 크기가 다른 요소들을 감싸고 있는 형태이기 때문에 첫 번째 축에서 각 요소를 불러오는 건 가능하지만 요소들이 서로 크기가 다르기 때문에 2번째 이상되는 축에서 slicing(':')을 활용하여 가져올 수 없습니다.
만약 numpy처럼 가져오고 싶다면 하나씩 요소들을 반환하고 또 내부에 인덱스를 입력하여 값들을 반환하면 됩니다.
m[0] # [0, 4]
m[1] # [1, 0]
m[2] # [2, 2]
m[3] # [3, 3]
m[4] # [4, 1]
print(m[0][1],m[1][1],m[2][1],m[3][1],m[4][1]) # 4 0 2 3 1
반면에 numpy는 내부 요소들의 크기를 통일시켜 한번에 감싸기 때문에 내부 요소들의 크기가 통일되어 2차원 이상의 축에서도 slicing 할 수 있습니다.
numpy와 list의 차이점은 아래의 링크를 참고하면 됩니다.
따라서 아래와 같이 list를 numpy로 변경하여 slicing 해준다면 오류 없이 원하는 값들을 반환할 수 있습니다.
type(m) # list
m_np = np.array(m)
print(m_np[:,0]) # [0 1 2 3 4]
print(m_np[:,1]) # [4 0 2 3 1]
numpy와 list간의 차이를 잘 비교하여 적시적소에 잘 사용하면 됩니다.
728x90
반응형
댓글