본문 바로가기
  • 블랜더 거실
IT인터넷/Python

[디지털 문해력]Python으로 시작하는 데이터 분석_Numpy 사용해보기(210927)

by bandiburi 2021. 10. 2.

라이브러리  Numpy는 고성능의 수치 계산을 위해 만들어진 라이브러리로 효율적인 데이터분석이 가능하도록 N차원의 배열 객체를 지원합니다. Numpy가 널리쓰이고 강력하다는 말을 듣게 해주는 것은 바로 Numpy의 배열 객체인 ndarray의 힘이라고 봐도 과언이 아닙니다.


numpy library에서 자주 사용하는 함수로는 아래와 같은 것들이 있으며 이 클래스에서 함께 배우게 됩니다.
np.array → 배열생성
np.zeros → 0이 들어있는 배열 생성
np.ones → 1이 들어있는 배열 생성
np.empty → 초기화가 없는 값으로 배열을 반환
np.arrange(n) → 배열 버전의 range 함수

 

○ 배열 만들기
- 데이터의 대부분은 숫자 배열로 볼 수 있다.
- 파이썬 리스트로도 계산 할 수 있지만 numpy는 list에 비해서 빠른 연산을 지원하고 메모리를 효율적으로 사용한다.

[예]
list(range(10)  → (출력) [0,1,2,~~~9]

import numpy as np
np.array([1,2,3,4,5])  → (출력) array([1,2,3,4,5])


○ 1차원 배열

np.array([1,2,3,4,5]) → (출력) array([1,2,3,4,5])
np.array([3, 1.4, 2, 3, 4]) → (출력) array([3. , 1.4, 2. , 3. , 4. ])

○ 2차원 배열

np.array([[1,2], [3, 4]]) → (출력) array([[1,2], [3, 4]])
np.array([1, 2, 3, 4], dtype='float') → (출력) array([1. , 2. , 3. , 4.])


○ 배열 데이터 타입 dtype

arr = np.array([1, 2, 3, 4], dtype=float) → (출력) array([1. , 2. , 3. , 4.])
arr.dtype → (출력) dtype('float64')
arr.astype(int) → (출력) array([1, 2, 3, 4])

- int 정수형 타입 : i, int_, int32, int64, i8
- float 실수형 타입 : f, float_, float32, float64, f8
- str 문자열 타입 : str, U, U32
- bool 부울 타입 : ?, bool_


○ 다양한 배열 만들기

np.zeros(10, dtype=int) → (출력) array([0, ~ 0])
np.ones( (3, 5), dtype=float) → (출력) array([[1., 1., 1., 1., 1.], [~~], [~~])  3*5의 배열
np.arange(0, 20, 2)  (start, end, step) → (출력) array([0, 2, 4, ~ 18])
np.linspace(0, 1, 5) * 0~1 사이를 5개로 나눠라 → (출력) array([0. , 0.25, 0.5, 0.75, 1.])


○ 난수로 채워진 배열 만들기

np.random.random((2,2))  *shape → (출력) array([0.3098, 0.8586], [0.89, 0.19]) 2*2배열
np.random.normal(0, 1, (2, 2)) *평균, 표준편자인 데이터를 2*2 행렬로 표기 → (출력) array([ [ ?, ?], [?, ?] ])
np.random.randint(0, 10, (2, 2)) * 0에서 10 사이의 수를 2*2로 표기 → (출력) array([[3,9],[3,2]])


○ 배열의 기초

x2 = np.random.randint(10, size=(3,4))
x2.ndim  → (출력) 2  (차원을 나타냄)
x2.shape → (출력) (3, 4)
x2.size → (출력)12  (데이터 수)
x2.dtype → (출력) dtype('int64')


○ 찾고 잘라내기

○ Indexing : 인덱스로 값을 찾아낸다

[0, 1, 2, 3, 4, 5, 6]의 경우
x = np.arange(7)
x[3] → (출력) 3
x[7] → (출력) IndexError : index 7 is out of bounds
x[0] = 10  → (출력) * 배열의 '0'값이 '10'으로 변경됨


○ Slicing : 인덱스 값으로 배열의 부분을 가져오는 것

x = np.arange(7) → (출력) [0, 1, ~ 6]
x[1:4]  → (출력) array([1,2,3]) * start : end-1
x[1:]  → (출력) array([1,2,~6])
x[:4]  → (출력) array([0,~3])
x[: : 2]  → (출력) array([0, 2, 4, 6]) *2씩 건너뛰면서


[실습2] 배열의 기초

import numpy as np

print("1차원 array")
array = np.arange(10)
print(array)

# Q1. array의 자료형을 출력해보세요.
print(type(array))

# Q2. array의 차원을 출력해보세요.
print(array.ndim)

# Q3. array의 모양을 출력해보세요.
print(array.shape)

# Q4. array의 크기를 출력해보세요.
print(array.size)

# Q5. array의 dtype(data type)을 출력해보세요.
print(array.dtype)

# Q6. array의 인덱스 5의 요소를 출력해보세요.
print(array[5])

# Q7. array의 인덱스 3의 요소부터 인덱스 5 요소까지 출력해보세요.
print(array[3:6])


[실습3] 배열의 기초

import numpy as np

print("2차원 array")
matrix = np.arange(1, 16).reshape(3,5)  #1부터 15까지 들어있는 (3,5)짜리 배열을 만듭니다.
print(matrix)

# Q1. matrix의 자료형을 출력해보세요.
print(type(matrix))

# Q2. matrix의 차원을 출력해보세요.
print(matrix.ndim)

# Q3. matrix의 모양을 출력해보세요.
print(matrix.shape)

# Q4. matrix의 크기를 출력해보세요.
print(matrix.size)

# Q5. matrix의 dtype(data type)을 출력해보세요.
print(matrix.dtype)

# Q6. matrix의 (2,3) 인덱스의 요소를 출력해보세요.
print(matrix[2,3])

# Q7. matrix의 행은 인덱스 0부터 인덱스 1까지, 열은 인덱스 1부터 인덱스 3까지 출력해보세요.
print(matrix[0:2,1:4])


○ Reshape (모양바꾸기) : array의 shape를 변경한다

x=np.arange(8)
x.shape → (출력) (8)
x2 = x.reshape((2,4)) → (출력) array ([[0, 1, 2, 3], [4, 5, 6, 7]])
x2.shape → (출력) (2, 4)



○ Concatenate & Split (이어 붙이고 나누기) : array를 이어 붙인다.

[0, 1, 2] [3, 4, 5] -> [0 ~ 5]
x = np.array([0, 1, 2])
y = np.array([3, 4, 5])
np.concatenate([x,y]) → (출력) array([0~5])

np.concatenate: axis 축을 기준으로 이어붙일 수 있다.

matrix = np.arange(4).reshape(2,2)
np.concatenate([matrix, matrix], axis=0) * axis가 0이면 아래로 붙는다. 1이면 가로 방향


np.split: axis축을 기준으로 나눌 수 있다.

matrix = np.arange(16).reshape(4,4)
upper, lower = np.split(matrix, [3], axis=0)   * 아래 방향으로 인덱스가 3인 곳에서 분리

matrix = np.arange(16).reshape(4,4)
left, right = np.split(matrix, [3], axis=1) * 오른쪽 방향으로 인덱스가 3인 곳에서 분리


[실습4] Reshape & 이어붙이고 나누기

import numpy as np

print("array")
array = np.arange(8)
print(array)
print("shape : ", array.shape, "\n")

# Q1. array를 (2,4) 크기로 reshape하여 matrix에 저장한 뒤 matrix와 그의 shape를 출력해보세요.
print("# reshape (2, 4)")
matrix = array.reshape(2,4)
print(matrix.shape)

print(matrix)
print("shape : ", matrix.shape)


[실습5] 가로 세로로 붙이기

import numpy as np

print("matrix")
matrix = np.array([[0,1,2,3], [4,5,6,7]])
print(matrix)
print("shape : ", matrix.shape, "\n")

# (아래의 배열 모양을 참고하세요.)
# Q1. matrix 두 개를 세로로 붙이기
m = np.concatenate([matrix,matrix],axis=0)
print(m)

'''
[[0 1 2 3]
[4 5 6 7]
[0 1 2 3]
[4 5 6 7]]
'''

# Q2. matrix 두 개를 가로로 붙이기
n = np.concatenate([matrix,matrix],axis=1)
print(n)
'''
[[0 1 2 3 0 1 2 3]
[4 5 6 7 4 5 6 7]]
'''


[실습6] 나누기

import numpy as np

print("matrix")
matrix = np.array([[ 0, 1, 2, 3],
                   [ 4, 5, 6, 7],
                   [ 8, 9,10,11],
                   [12,13,14,15]])
print(matrix, "\n")

# Q1. matrix를 [3] 행에서 axis 0으로 나누기

'''
[[0  1   2  3]
[4  5   6  7]
[8  9  10 11]],

[12 13 14 15]
'''
a, b = np.split(matrix,[3],axis=0)

print(a, "\n")
print(b, "\n")


# Q2. matrix를 [1] 열에서 axis 1로 나누기
'''
[[ 0]
[ 4]
[ 8]
[12]],

[[ 1  2  3]
[ 5  6  7]
[ 9 10 11]
[13 14 15]]
'''

c, d = np.split(matrix, [1], axis=1)

print(c, "\n")
print(d)


○ Numpy 연산

- 루프는 느리다
- array의 모든 원소에 5를 더해서 만드는 함수

def add_five_to_array(values):
    output = np.empty(len(values))
    for i in range(len(values)):
        output[i] = values[i] + 5
    return output

values = np.random.randint(1,10, size=5)
add_five_to_array(values) → (출력) [1, 3, 7 5, 2] => [6, 8, 12, 10, 7]


- 하지만 array의 크기가 크다면..?

big_array = np.random.randint(1, 100, size=10000000)
add_five_to_array(big_array) # 이 경우 5.3초가 소요

big_array + 5 # 이렇게 하면 33.5ms에 처리가능

- 기본 연산 : array는 +, -, *, /에 대한 기본 연산을 지원한다.

x = np. arange(4) → (출력) array([0,1,2,3])
x + 5 # array 5를 더한 것
x - 5  # 5를 뺀 것
x * 5
x / 5

- 행렬간 연산 : 다차원 행렬에서도 적용가능하다

x = np.arange(4). reshape((2,2))
y = np.random.randint(10, size=(2,2))
x + y  # 2 * 2 행렬간 더하고 뺀 것 결과 보여줌
x - y


[실습7] Numpy연산

import numpy as np

array = np.array([1,2,3,4,5])
print(array)


# Q1. array에 5를 더한 값을 출력해보세요.
print(array+5)
# Q2. array에 5를 뺀 값을 출력해보세요.

print(array-5)
# Q3. array에 5를 곱한 값을 출력해보세요.
print(array * 5)

# Q4. array를 5로 나눈 값을 출력해보세요.
print(array / 5)

# Q5. array에 array2를 더한 값을 출력해보세요.    
array2 = np.array([5,4,3,2,1])
print(array + array2)

# Q6. array에 array2를 뺀 값을 출력해보세요.
print(array - array2)


○ Broadcasting : shape이 다른 array끼리 연산

matrix + 5
matrix + np.array([1,2,3])  # 3*3과 1*3이면  1*3이 3*3으로 해서 계산
np.arange(3).reshape((3,1)) + np.arange(3) 이면 가로, 세로로 반복 늘여서 계산


[실습8] 브로드캐스팅

import numpy as np

'''
[[0]
[1]
[2]
[3]
[4]
[5]] 배열 A와

[0 1 2 3 4 5] 배열 B를 선언하고, 덧셈 연산해보세요.
'''

A = np.arange(6).reshape((6,1))
B = np.arange(6)

print(A + B)




○ 집계함수: 데이터에 대한 요약 통계를 볼 수 있다.

x = np.arange(8).reshap((2,4))
np.sum(x) → (출력) 28
np.min(x) → (출력) 0
np.max(x) → (출력) 7
np.mean(x) → (출력) 3.5
np.std(x)

np.sum(x, axis = 0) → (출력) array([4, 6, 8, 10]) # axis는 세로 방향으로 0, 1, 번호가 붙여짐
np.sum(x, axis=1) → (출력) array([6, 22])


○ 마스킹 연산: True, False array를 통해서 특정 값들을 뽑아내는 방법

x = np.arange(5)
x<3 → (출력) array([True, True, True, False, False])
x>5
x[x < 3] → (출력) array([0, 1, 3]) True인 값만 출력


[실습9] 집계함수 & 마스킹연산

import numpy as np

matrix = np.arange(8).reshape((2, 4))
print(matrix)

# Q1. sum 함수로 matrix의 총 합계를 구해 출력해보세요.
print(np.sum(matrix))

# Q2. max 함수로 matrix 중 최댓값을 구해 출력해보세요.
print(np.max(matrix))

# Q3. min 함수로 matrix 중 최솟값을 구해 출력해보세요.
print(np.min(matrix))

# Q4. mean 함수로 matrix의 평균값을 구해 출력해보세요.
print(np.mean(matrix))

# Q5. sum 함수의 axis 매개변수로 각 열의 합을 구해 출력해보세요.
print(np.sum(matrix, axis=0))

# Q6. sum 함수의 axis 매개변수로 각 행의 합을 구해 출력해보세요.
print(np.sum(matrix, axis=1))

# Q7. std 함수로 matrix의 표준편차를 구해 출력해보세요.
print(np.std(matrix))

# Q8. 마스킹 연산을 이용하여 matrix 중 5보다 작은 수들만 추출하여 출력해보세요.
print(matrix[matrix < 5])


[실습10] 양치기 소년의 거짓말 횟수 구하기

import numpy as np

daily_liar_data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]

# 양치기 소년이 거짓말을 몇 번 했는지 구하여 출력해주세요.
print(len(daily_liar_data) - np.sum(daily_liar_data))

728x90
반응형

댓글