01. Numpy

jeongwoo·2022년 3월 8일
2
post-thumbnail

01. Numpy

라이브러리 불러오기

import numpy as np

numpy의 alias(as)로 np를 쓰는 건 관례 아닌 관례이다.

np.array()

# 1차원 리스트
list_a = [i for i in range(10)]

# 넘파이 배열로 변환
np_arr = np.array(list_a)

# 확인
print(np_arr)  # [0 1 2 3 4 5 6 7 8 9]

list_a를 넘파이 배열로 변환해준다.

# 2차원 리스트
list_b = [[i for i in range(5)], [i for i in range(5, 10)]]

# 확인
print(list_b)  # [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]

# 넘파이 배열로 변환
np_arr2 = np.array(list_b)

# 확인
print(np_arr2)	# [[0 1 2 3 4]
 				#  [5 6 7 8 9]]

2차원 리스트의 경우 [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]로 출력되고 이를 넘파이로 출력하면 [[0 1 2 3 4] [5 6 7 8 9]]로 출력된다.

axis(축)

- np.argmax(arr, axis=n)

n차원일 경우 axis=0, axis=1, ...., axis=n-1까지 존재한다.
가장 많이 사용하는 2차원에 대해서만 살펴보자.
cf) 3차원의 경우 z축이 axis=0, y축이 axis=1, x축이 axis=2가 된다.

출처:https://stackoverflow.com/questions/17079279/how-is-axis-indexed-in-numpys-array

행방향 / 열기준(y축, 세로)을 axis=0, 열방향 / 행기준(x축, 가로)을 axis=1이라고 한다.
판다스에서도 사용되는 개념으로 잘 숙지하자.
하지만 판다스에서 df의 열을 삭제하기 위해선 df.drop(col, axis=1, inplace=True)를 써주는데..
다들 여기서 헷갈리기 시작한다@_@..
그림을 보고 방향과 기준을 잘 기억하자!

배열 집계

집계를 할 때,
axis=0 : 열 기준 집계 (위·아래로 집계)
axis=1 : 행 기준 집계 (좌·우로 집계)

arr = np.array([[1, 2, 3, 4],
                [5, 6, 7, 8],
                [9, 10, 11, 12]])

# 전체 합 집계
print(np.sum(arr))  # 78

# 열 기준 합 집계
print(np.sum(arr, axis=0))  # [15 18 21 24]

# 행 기준 합 집계
print(np.sum(arr, axis=1))  # [10 26 42]
'''
cf)
[10
 26
 42]
'''

# 전체 중에서 가장 큰 값 인덱스
print(np.argmax(arr))  # 11

# 열 기준(위·아래) 큰 값 인덱스
print(np.argmax(arr, axis=0))  # [2 2 2 2]

# 행 기준(좌·우) 큰 값 인덱스
print(np.argmax(arr, axis=1))  # [3 3 3]
'''
cf) list_a의 idx
[[0, 1, 2, 3],
 [4, 5, 6, 7],
 [8, 9, 10, 11]]
'''

np.max(), np.min, np.mean(), np.std()
cf) np.average()와 np.mean()의 차이

    1. np.mean() 함수는 항상 산술 평균을 계산을 해주게 되며,
      dtype, out, where, keepdims등과 같이 출력에 대하여 많은 매개변수들을 추가적으로 사용가능
    1. np.average()는 np.mean() 함수에서는 불가능한 배열의 가중 평균이 계산가능

cf2) np.argmin()도 있음

np.ndim

print(list_a.ndim)  # 1
print(list_b.ndim)  # 2

ndim은 Number of Dimension의 약자로, arr이 몇 차원인지 알려준다.

np.shape

list_a.shape  # (10,)
list_b.shape  # (2, 5)

np.shape은 튜플 형태로 arr의 차원을 알려준다.
1차원 배열의 경우, 방향이 존재하지 않고 개수만 존재하기때문에 (10,)처럼 출력된다.
튜플의 원소는 순서대로 axis 0, axis1의 크기를 의미한다.
3차원일 경우 (a, b, c)형태로 표시되고 이는 각각 axis0, axis1, axis2의 크기를 의미한다.
cf) axis는 뒤에서 설명한다.

np.reshape(m, n)

arr = np.array([1, 2, 3, 4])
arr.shape  # (4,)

print(arr)  # [1 2 3 4]

arr = arr.reshape(2, -1)

print(arr)  # [[1 2]
			# [3 4]]

np.reshape(m, n)은 딥러닝에서 필요한 개념이다.
(m, -1) 또는 (-1, n)처럼 한 쪽 크기만 지정할 수 있다. 이 경우 -1에는 알아서 채워진다.
단, 원소의 개수가 맞아야한다.
예를 들어 총 원소의 개수가 12개일 때, np.reshape(7, -1)를 쓰면 에러!
m과 n에는 총 원소 개수의 약수를 쓰도록 하자.

인덱싱과 슬라이싱

  • arr[행, 열]

[[행, 열]과 [행, 열]...]이 아닌 [[행...]과 [열...]] 순으로 쓴다.

  • arr[[행1, 행2, ...], [열1, 열2, ...]]

행 또는 열 전체를 선택할 때는 :만 써주면 된다.

  • arr[:, [열1:열3]]
arr = np.array([[1, 2, 3],
               [4, 5, 6]])

print(arr)  # [[1 2 3]
			# [4 5 6]]

# 2열 출력하기([2 5])
print(arr[:, 1])  # [2 5]

# 2, 6만 출력
print(arr[[0, 1], [1, 2]])  # [2 6]

# 3, 6만 출력
print(arr[:, 2])  # [3 6]

조건 조회

score= np.array([[72, 87, 96, 68, 91, 73],
                 [78, 23, 84, 90, 93, 65]])

# 80점 이상만 조회
print(score[score >= 80])  # [87 96 91 84 90 93]

# 80점 이상 90점 미만 조회
print(score[(score >= 80) & (score < 90)])  # [87 84]

# 30점 미만인 점수 2배하기
score[score < 30] = score[score < 30] * 2

print(score)
'''
[[72 87 96 68 91 73]
 [78 46 84 90 93 65]]
'''

여러 조건들을 & 또는 |로 붙여서 쓸 수 있다.
단, 이 경우 조건들을 각각 ()로 감싸줘야한다.

np.where(조건, '참일 경우', '거짓일 경우')

score= np.array([[72, 87, 96, 68, 91, 73],
                 [78, 23, 84, 90, 93, 65]])

print(np.where(score >= 80, 'good', 'bad'))

배열 연산

같은 index자리끼리 연산을 한다.
cf) 행렬의 곱셈은 np.dot(A, B)를 사용한다.

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(a+b)  # print(np.add(a, b))와 동일
'''
[[ 6  8]
 [10 12]]
'''

print(a*b)  # print(np.multiply(x, y))와 동일
'''
[[ 5 12]
 [21 32]]
'''

뺄셈의 경우 a-b 또는 np.subtract(a, b),
나눗셈의 경우 a/b 또는 np.divide(a, b)로 쓴다.

np.column_stack(col1, col2)

  • np.column_stack(기존_col, 새로운_col): 칼럼을 옆에 추가해준다(기존_col과 새로운_col 순서 바뀌어도 됨).
# ex)
print(x_train.shape, x_test.shape)  # (42, 1) (14, 1)

train_poly = np.column_stack((x_train ** 2, x_train))
test_poly = np.column_stack((x_test ** 2, x_test))
print(train_poly.shape, test_poly.shape)  # (42, 2) (14, 2)

0개의 댓글