본문 바로가기
  • Hello_
Python/Error

[Python_Error] TypeError: only integer scalar arrays can be converted to a scalar index

by LDwDL 2022. 9. 29.
728x90
반응형

본 포스팅은 업무 중 발생했던 오류들을 예시를 통해 어떻게 해결을 했는지 적을 예정이다.

 

TypeError: only integer scalar arrays can be converted to 
a scalar index

list index에 scalar 가 아닌 np.array가 들어갔을 때 발생하는 오류이다.

 

[예시]

import numpy as np

rand_cube_3D = np.random.randint(0,10,size=[5,5,5])
print(rand_cube_3D)
"""
array([[[3, 1, 4, 8, 9],
        [7, 1, 2, 8, 3],
        [4, 9, 0, 6, 9],
        [8, 9, 9, 4, 0],
        [5, 0, 5, 8, 1]],

       [[9, 4, 2, 9, 2],
        [6, 7, 6, 8, 8],
        [3, 7, 8, 7, 9],
        [6, 4, 6, 4, 7],
        [5, 3, 4, 2, 4]],

       [[1, 3, 5, 7, 2],
        [3, 0, 7, 2, 3],
        [0, 0, 0, 2, 6],
        [7, 2, 5, 2, 2],
        [0, 2, 1, 5, 7]],

       [[2, 4, 6, 9, 5],
        [4, 4, 3, 4, 2],
        [9, 1, 4, 6, 5],
        [8, 9, 8, 3, 1],
        [3, 0, 6, 5, 5]],

       [[8, 2, 4, 7, 6],
        [3, 0, 9, 8, 6],
        [3, 3, 0, 7, 8],
        [1, 5, 1, 1, 6],
        [7, 3, 0, 1, 3]]])
"""

 

다음과 같이 3D array가 있고 중간값으로부터 특정 margin을 갖은 채로 crop을 하고 싶을 때 발생했던 오류이다.

bbox_center_x = 3
bbox_center_y = 3
bbox_center_z = 3

bbox_margin = np.array([2,2,2])

cropped_cube = rand_cube_3D[bbox_center_x-bbox_margin:bbox_center_x+bbox_margin,
                            bbox_center_y-bbox_margin:bbox_center_y+bbox_margin,
                            bbox_center_z-bbox_margin:bbox_center_z+bbox_margin,]
 
 
 #TypeError                                 Traceback (most recent call last)
----> 1 cropped_cube = rand_cube_3D[bbox_center_x-bbox_margin:bbox_center_x+bbox_margin,
      2                             bbox_center_y-bbox_margin:bbox_center_y+bbox_margin,
      3                             bbox_center_z-bbox_margin:bbox_center_z+bbox_margin,]

TypeError: only integer scalar arrays can be converted to a scalar index

 

이는 bbox margin 또한 array로 구성이 되어 있기 때문에 list 내 index에 array가 입력되어 발생된 오류이다. 이는 scalar 값으로 index를 변경한다면 쉽게 해결된다.

 

[해결]

cropped_cube = rand_cube_3D[bbox_center_x-bbox_margin[0]:bbox_center_x+bbox_margin[0],
                            bbox_center_y-bbox_margin[1]:bbox_center_y+bbox_margin[1],
                            bbox_center_z-bbox_margin[2]:bbox_center_z+bbox_margin[2],]
                            
print(cropped_cube.shape)
# (4, 4, 4)

 

 

 

728x90
반응형

댓글