본문 바로가기
🛠️Skill/Python

[Python] 브로드캐스팅, 슬라이싱(slicing), 인덱싱(indexing)

by Istj_eff 2022. 10. 3.

1. 브로드캐스팅(Broadcasting)

  • 일반적으로 numpy는 모양이 다른 배열끼리는 연산이 불가능하다. 브로드캐스팅은 어떤 조건만 만족한다면 모양이 다른 배열끼리의 연산도 가능하게 해주며 모양이 부족한 부분은 확장하여 연산을 수행할 수 있도록 한다는 것이라고 생각할 수 있다.

  • 브로드캐스팅이 일어날 수 있는 조건은 다음과 같다.
    • 차원의 크기가 1일때 가능하다 두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(0번 축이든 1번 축이든; 1행이든 1열이든) 가능하다.
    • 차원의 짝이 맞을 때 가능하다 차원에 대해 축의 길이가 동일하면 브로드캐스팅이 가능하다.
# 2x2, 1x1 행렬
a = np.array([[1,2],[3,4]])
a
[out]
array([[1, 2],
       [3, 4]])

# 2x2, 1x1 행렬의 브로드 캐스팅
a = np.array([[1,2],[3,4]])
a * 10
[out]
array([[10, 20],
       [30, 40]])

# 2x2, 1x2 행렬의 브로드 캐스팅
****a = np.array([[1,2],[3,4]])
b = np.array([10,20])
a * b   # b가 a와 똑같은 shape으로 변형된후 원소별 연산이 이루어진것이다
[out]
array([[10, 40],
       [30, 80]])

 


2. 슬라이싱 (Slicing)

[start index : end index] : 시작 인덱스부터 끝 인덱스 -1까지 리턴
nptest=np.arange(0,12).reshape(3,4) # 0~11 3x4형태로 배열 생성
nptest
=>array([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]])

# 인덱스
nptest[1][0] # 1행의 0열 인덱스
=>4

# 인덱스로 슬라이스하기
nptest[1] # 1행
=>array([4, 5, 6, 7])

 

✔️ 범위로 슬라이스하기 

# 범위로 슬라이스하기 [시작:끝]
nptest[1:] # 인덱스[1]부터 끝까지
=>array([[ 4,  5,  6,  7],
         [ 8,  9, 10, 11]])

# 전체다 [:]
nptest[:]
=>array([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]])

# 뒤에서부터 슬라이스 [음수로시작:]
nptest[-1:] # 제일 마지막행
=>array([[ 8,  9, 10, 11]])

# 열 한개만 슬라이스 [:,열]
nptest[:,2] # 2열만
=>array([ 2,  6, 10])

# 열블럭1 [:,열시작:열끝]
nptest[:,2:] # 2열부터 끝까지
=>array([[ 2,  3],
         [ 6,  7],
         [10, 11]])

# 열 처음부터 끝까지 [:,:]
nptest[:,:] 
=>array([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]])

# 행, 열 지정해서 슬라이스
nptest[1:,[1,3]] # 1행부터끝까지, 1열과 3열 추출
=>array([[ 5,  7],
         [ 9, 11]])

# 행, 열 지정해서 슬라이스(음수로)
nptest[-1:,[1,3]] # -1은 제일마지막행
=>array([[ 9, 11]])

 

 

3. 인덱싱 (Indexing)

팬시 인덱싱(Fancy indexing)

: 일정한 인덱싱 집합을 리스트 또는 ndarray로 지정해 해당 위치에 있는 데이터의 ndarray를 반환

 

✔️팬시 인덱싱 기본 예제

array1 = np.arange(1,10)
array2 = array1.reshape(3,3)
array2
# array([[1, 2, 3],
#        [4, 5, 6],
#        [7, 8, 9]])

array3 = array2[[0,1,2],2] # 0,1,2번째 row의 2번째 인덱스 
array3
# array([3, 6, 9])

array4 = array2[[0,1,2],0:2] # 0,1,2번째 row의 0부터 1까지 인덱스
array4
# array([[1, 2],
#        [4, 5],
#        [7, 8]])

array5 = array2[[0,1]] # 0,1번째 row추출
array5
# array([[1, 2, 3],
#        [4, 5, 6]])

 

불린 인덱싱(Boolean indexing)

: 특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 데이터의 ndarray를 반환. 매우 자주 사용

 

✔️불린 인덱싱 기본 예제

array1 = np.arange(1,10)

# []안에 array1>5 Boolean indexing 적용
array2 = array1[array1 > 5]
print('array1>5 불린 인덱싱 값:', array2)

# array1>5 불린 인덱싱 값: [6 7 8 9]

 

 

 

댓글