본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 9-2주차: ndarray 축(axis), 브로트캐스팅(broadcasting), 불린 인덱싱(boolean indexing)

<9-2주차 수강 클립>

03. 데이터 처리를 위한 Python (Numpy)

07. axis(축) 이해 및 axis를 파라미터로 갖는 함수 활용하기

08. broadcasting 이해 및 활용하기

09. Boolean indexing으로 조건에 맞는 데이터 선택하기

 


 

이번 주차에는 저번 시간에도 잠깐 등장한 ndarray의 축(axis)에 관한

내용이 등장합니다.

또한 차원이 '다른' ndarray 간의 연산을 위한 브로드캐스팅,

boolean indexing으로 조건에 맞는 데이터를 선택하는 법에 대해서

알아보았습니다.

>>수강 인증샷<<

 


 

07. axis(축) 이해 및 axis를 파라미터로 갖는 함수 활용하기

 

- axis 이해하기

몇몇 함수에는 axis keyword 파라미터가 존재_ 축→차원! (차원이 1개 = 축이 1개)

axis 값이 없는 경우에는 전체 데이터에 대해 적용

axis 값이 있는 경우에는 해당 axis값을 따라서 연산 적용 (해당 축 방향으로 '압축'을 한다)

 

axis를 파라미터로 갖는 함수를 이용하기

    1. 거의 대부분의 연산 함수들이 axis 파라미터를 사용

    2. 이 경우, 해당 값이 주어졌을 때, 해당 axis를 따라서 연산이 적용

        → 따라서 결과는 해당 axis가 제외된 나머지 차원의 데이터만 남게 됨

    ex) np.sum, np.mean, np.any 등등..

 

x = np.arange(15)
np.sum(x, axis=0)

: 1차원 데이터에 적용하기

 

#axis=0: 행 증가(아래) asix1: 열 증가(위)
y = x.reshape(3, 5)

np.sum(y) #전체 데이터 더함
np.sum(y, axis=0) #행 증가 방향 #5차원 벡터
np.sum(y, axis=1) #열 증가 방향 #3차원 벡터

: 2차원 행렬에 적용하기

 

z = np.arange(36).reshape(3, 4, 3)

np.sum(z)
np.sum(z, axis=0) #0번째 찌부->4행 3열
np.sum(z, axis=1) #1번째 찌부->3행 3열
np.sum(z, axis=2) #2번째 찌부->3행 4열

: 3차원 텐서에 적용하기

 

np.sum(z, axis=-1) #axis 0, 1, 2 == -3, -2, -1

: 음수 인덱싱 지원 (뒤에서부터)

 

np.sum(z, axis=(0, 1)) #0, 1번째 찌부->벡터
np.sum(z, axis=(0, 2)) #0, 2번째 찌부->벡터

: axis의 값이 튜플일 경우 → 해당 튜플에 명시된 모든 axis에 대해서 연산

 


 

08. broadcasting 이해 및 활용하기

 

- 브로드캐스팅

shape이 같은 두 ndarray에 대한 연산은 각 원소별로 진행

연산되는 두 ndarray가 다른 shape을 갖는 경우 브로드 캐스팅(shape을 맞춤)후 진행

 

- 브로드캐스팅 Rule

뒷 차원에서부터 비교하여 Shape이 같거나 (비어있어도 가능), 차원 중 값이 1인 것(비교하는 차원 둘 중 하나 이상이 1)이 존재하면 가능

ex) a(4*3) b(,*3)이 있을 때 뒷차원인 '3'이 같음

 

x = np.arange(15).reshape(3, 5)
y = np.random.rand(15).reshape(3, 5)
print(x)
print(y)
print(x + y) #크기 동일한 행렬 사이 연산

: shape이 같은 경우의 연산

 

#모든 원소에 적용
x + 2
x * 2
x ** 2
x % 2 == 0

: scalar(상수)와의 연산

 

 

- shpae이 다른 경우의 연산

a = np.arange(12).reshape(4, 3)
b = np.arange(100, 103) #100부터 103까지 크기 3
c = np.arange(1000, 1004)
d = b.reshape(1, 3)

#b와 d의 shape 차이
print(a.shape)
print(b.shape) #크기가 3인 벡터! (3, )
print(c.shape)
print(d.shape) #1행 3열의 행렬! (1, 3)
print(d)
a + b

: 브로드캐스팅 발생 → 뒤에서부터 차원 비교, a(4*3) b(,*3)에서 3끼리 같고 차원 중 하나가 비어있기 때문!

 

a + c

: 연산 실패 → a(4*3) c(,*4)에서 뒤에서부터 차원 비교했을 때 3!=4 이므로!

 

a + d

: 브로드캐스팅 발생 → a(4*3) d(1*3) 뒤에서부터 비교했을 때 3==3, 둘 중 하나가 1이기 때문!

 


 

09. Boolean indexing으로 조건에 맞는 데이터 선택하기

 

- Boolean indexing

ndarray 인덱싱 시, bool 리스트를 전달하여 True인 경우의 원소만 필터링

브로드캐스팅을 활용하여 ndarray로부터 bool list 얻기 ex)짝수인 경우만 찾아보기

 

x = np.random.randint(1, 100, size=10)
#mask: 필터(조건->필터링)를 씌운다고 생각!
even_mask = x % 2 == 0

: 브로드캐스팅 발생 → 스칼라

 

x[even_mask] #위치가 True인 인덱스의 원소만 가져옴

: bool 리스트를 인덱스로 전달

 

x[x % 2 == 0]
x[x > 30]

: 조금 더 일반적인 표현

 

- 다중조건 사용하기

파이썬 논리 연산자인 and, or, not 키워드 사용 불가

& - AND

| - OR

 

x[(x % 2 == 0) & (x < 30)]
x[(x > 50) | (x < 30)]

 

- 예제) 2019년 7월 서울 평균기온 데이터

평균기온이 25도를 넘는 날 수는?

평균기온이 25를 넘는 날의 평균 기온은?

temp = np.array(
        [23.9, 24.4, 24.1, 25.4, 27.6, 29.7,
         26.7, 25.1, 25.0, 22.7, 21.9, 23.6, 
         24.9, 25.9, 23.8, 24.7, 25.6, 26.9, 
         28.6, 28.0, 25.1, 26.7, 28.1, 26.5, 
         26.3, 25.9, 28.4, 26.1, 27.5, 28.1, 25.8])
len(temp[temp > 25.0]) #21
np.sum(temp > 25.0) # temp > 25.0 -> True or False 리스트이므로 1 or 0 연산

: True or False로 이루어진 리스트 sum → 1과 0의 합 = 개수

 

np.mean(temp[temp > 25.0])

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형