Numpy를 활용하여 데이터 분석 해보기3 - 배열 데이터 가공(슬라이싱), 다차원 배열 연산

반응형

Numpy 외부 모듈(라이브러리)을 활용해보자 - 3

# 넘파이 외부 모듈 호출하기

import numpy as np
# 넘파이 모듈 호출, 편의상 np로 사용

 

 

# 넘파이를 이용하여 배열 다루기

배열 데이터 추출하기 (Slicing)

  • array[시작값:끝값] : 배열 array의 시작값부터 끝값 이전까지의 데이터 추출
    • 다차원 배열 또한 같은 방식으로 데이터 추출 가능
x = numpy.random.randint(1,10, 5) # 1차원 배열 1~9 난수 5개
>>> array([5, 9, 5, 4, 9])

# 2번째에서 3번째자리까지의 데이터 추출하기
# 인덱스는 0부터 시작이며, 끝 값 설정은 끝 값 까지가 아닌 이전 값 까지 유효
# 즉, 슬라이싱에서의 [1:3]은 1(0부터시작이므로 2번째), 3(0부터 시작, 끝 값 이전 값이므로 3번째)
x[1:3]
>>> array([9, 5])

x = numpy.random.randint ( 1, 10, (3,5) ) # 2차원 배열 1~9의 난수, 3x5배열
>>> array([[2, 5, 6, 5, 3],
    	   [6, 9, 9, 4, 2],
    	   [4, 9, 4, 6, 2]])
       
# 슬라이싱을 이용하여 데이터 추출
# 2행부터 3열 이후의 데이터 추출하기
x[1: ,2: ]
>>> array([[9, 4, 2],
       [4, 6, 2]])

# 1행과 3행의 데이터만 추출하기
x[ : , [0,2] ]
>>> array([[2, 6],
       [6, 9],
       [4, 4]])

 

배열 데이터 추출시 주의사항 (슬라이싱 주의사항)

  • 배열a의 데이터를 추출하여 배열b에 저장 할 경우
    • 배열b의 값 변경시 값이 메모리를 공유하기 때문에 원본의 배열a 값도 변경
a = numpy.arange(1,5)
>>> array([1, 2, 3, 4]) # 배열에 1,2,3,4 값 입력

b = a[1:3]
>>> array([2, 3]) # a의 2~3번째 값 저장

b[0] = 100
>>> array([100,   3]) # b의 첫번째 값 100으로 변경

print(a)
>>> array([  1, 100,   3,   4])
# a[1]과 b[0]는 같은 메모리 주소를 참조하므로 값이 같이 변경

 

  • 원본 값 변경 없이 다른 배열에 저장하는 방법
    • copy() 함수를 이용하여 각각의 값을 갖게 할 수 있음
# 위와 동일한 코드이나 a의 값 입력시 .copy() 함수를 사용 함
a = numpy.arange(1,5)
>>> array([1, 2, 3, 4]) # 배열에 1,2,3,4 값 입력

b = a[1:3].copy()
>>> array([2, 3]) # a의 2~3번째 값 복사

b[0] = 100
array([100,   3]) # b의 첫번째 값 100으로 변경

print(a)
>>> array([1, 2, 3, 4])
# 서로 각각의 값을 가지며 값을 변경하여도 값 변화가 없음

원본의 값이 변하는만큼 실수하면 복구가 어려울 수 있으므로 꼭 유의하고 조심하자

 

배열 데이터의 중복 값 제거하고 정렬하기

  • unique(a) : a의 중복 값을 제거하고 오름차순으로 정렬
page_view = [1,5,3,1,40,22,33,56,12,1,5,3]
x = numpy.array(page_view)
>>> array([ 1,  5,  3,  1, 40, 22, 33, 56, 12,  1,  5,  3])
# 리스트를 배열로 변환

x = numpy.unique(x)
print(x)
>>> array([ 1,  3,  5, 12, 22, 33, 40, 56])
# 중복 값 제거, 오름차순 정렬

 

배열에서 원하는 데이터 가져오기

  • 배열의 접근(accessing)과 boolean 연산을 통해 데이터 가져오기
    • 조건식의 반환값은 항상 bool 타입(참/거짓)이므로 이 값을 이용하여 데이터를 가져올 수 있음
    • 배열에 접근하여 조건식을 쓰는 경우 bool 타입이 아닌 조건이 참인 실제 값을 가져올 수 있음
    • numpy에서는 and를 &로 표기하며, or를 |로 표기함
x = np.random.randint(1,100, 5)
>>> array([36,  3, 88, 61, 26])

# 50보다 큰 데이터가 몇개인지 확인해보자
(x>50).sum()
>>> 2
# 조건이 참일 경우 반환되는 bool값 더하면 갯수 확인 가능

# 50보다 큰 데이터가 무엇이 있는지 확인해보자
x[ x>30 ]
>>> array([36, 88, 61])
# n[m]의 형태일 경우, bool 값이 아닌 데이터의 값을 반환

# 30보다 작고, 70보다 큰 데이터만 가져와보자
x[ (x>70) & (x<30) ]
>>> array([ 3, 88, 26])

# 30보다 크고, 70보다 작은 데이터만 가져와보자
x[ (x<70) & (x>30) ]
>>> array([36, 61])

 

배열에서 필요한 연산하기

  • 1차원 배열 연산
    • 배열의 크기가 맞아야 정상적인 연산을 수행
x = numpy.random.randint(1, 10, 4)
print(x)
y = numpy.random.randint(1, 5, 4)
print(y)
>>> [4 9 1 7] # 배열x
>>> [3 1 1 3] # 배열y

# 1차원 배열끼리의 사칙연산
x+y
>>> array([ 7, 10,  2, 10])

x-y
>>> array([1, 8, 0, 4])

x*y
>>> array([12,  9,  1, 21])

x/7
>>> array([1.33333333, 9.        , 1.        , 2.33333333])

 

  • 2차원 배열 연산
    • 배열의 크기가 맞아야 정상적인 연산을 수행
    • 1차원의 배열도 열의 갯수만 맞으면 연산을 수행
      • 다차원 배열의 모든 행을 1차원 배열의 값으로 연산 진행
        • 예) 1차원배열 [1,2] / 2차원배열 [ [1,2], [3,4] ] 의 합연산
          > 1차원배열의 [1,2] + 2차원배열의 [1,2]
          > 1차원배열의 [1,2] + 2차원배열의 [3,4]
          > 연산결과 [ [2,4], [4,6] ]
    • 1차원 배열 연산과 동일하므로 소스코드는 생략합니다.

 

  • numpy.array(a) ~ : a의 각 요소마다 동일 연산 (Broadcasting)
    • 특정 연산을 배열의 각각의 값에 동일한 연산을 수행
brod = numpy.arange(10, 51, 10)
print(brod)
brod = numpy.array(brod)-5 # 브로드캐스팅 (각 요소마다 -5 연산)
print(brod)
>>> [10 20 30 40 50] # 브로드캐스팅 전
>>> [ 5 15 25 35 45] # 브로드캐스팅 후
# 각각의 값에 -5 를 연산 수행

 

 

반응형