Search

Numpy

넘파이 특징

고속 연산에 유리
쉽고 빠른 배열 변환 가능
다양한 내장 함수 제공
성능향상을 위해 하나의 데이터 타입만 받을 수 있음
크기도 고정되어 있다.

왜 배열인가

→ 리스트의 각 요소에 2를 곱하고 싶다면
# for문을 돌리거나 리스트 컴프리헨션을 사용해야 됨 a = [1,2,3,4,5,6,7,8,9] a = [i * 2 for i in a] print(a) # 하지만, 배열을 사용하면 a = np.array(a)
Python
복사

ndarray 생성

list 나 tuple과 같은 시퀀스 자료형으로부터 생성한다.
import numpy as np # 1차원 x = np.array((0.1,0.2,0.3)) # np.array([0.1,0.2,0.3]) 도 가능 x
Python
복사
array([0.1, 0.2, 0.3])
x.dtype
Python
복사
dtype('float64')
# 2차원 y = np.array(((1,2,3),(4,5,6))) # [(1,2,3),(4,5,6)], [[1,2,3],[4,5,6]] 도 가능 y y.shape
Python
복사
array([[1, 2, 3], [4, 5, 6]]) (2, 3)

ndarray 주요 속성

shape
배열 형태 확인
dtype
요소의 데이터 타입 확인
ndim
차원수 확인
len(x.shape) # 동일
Python
복사
size
요소 개수 : shape의 모든 값 곱

ndarray 주요 함수

reshape(n,m)
배열의 차원을 다양한 형태로 변환
a = np.array([[1,2,3], [4,5,6]]) # (2,3) -> (3,2) 배열로 reshape b = a.reshape(3,2) b a1 = np.array([[1,2,3], [4,5,6]]) c = a1.reshape(6,) c
Python
복사
[[1 2] [3 4] [5 6]] [1 2 3 4 5 6]
< -1 의 활용 >
계산 가능한 정수로 한쪽의 크기를 지정해야 오류가 발생하지 않는다.
(m, -1) 또는 (-1, n) 처럼 사용해서 행 또는 열의 크기를 한쪽만 지정할 수 있다.
a.reshape(1,-1) a
Python
복사
[[1 2 3 4 5 6]]
np.reshape(배열, (n,m))
reshape메소드와 같음. 함수라는 점이 차이
b = np.reshape(a,(3,2)) b c = np.reshape(a1,(6,))
Python
복사
[[1 2] [3 4] [5 6]] [1 2 3 4 5 6]

배열 인덱싱과 슬라이싱

인덱싱
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(a[0, 1]) # 첫 번째 행, 두 번째 열 조회 print(a[[0, 1], :]) # 첫 번째, 두 번째 행 조회 print(a[[0, 1]]) # 모든 열을 조회할 경우에는, 생략할 수 있음 # 모든 행을 조회하는 경우에는 생략할 수 없음. # 모든 행, 열 조회 print(a[:]) # a[:,:] , a[[0,1,2]] # 두 번째 행, 두 번째 열 요소 조회 print(a[1, 1]) print(a[[0,1],[0,1]])
Python
복사
2 [[1 2 3 ] [4 5 6 ]] [[1 2 3] [4 5 6] [7 8 9]] 5 [1 5]
슬라이싱
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) a[0:2,:] # 1 ~ 2번째 행, 모든 열 = a[0:2] a[0,0:2] # 1번째행, 1 ~ 2번째 열 조회
Python
복사
[[1 2 3] [4 5 6]] [1 2]

초기화 관련 편의함수

인자로는 배열의 차원을 listtuple 로 지정한다.
zeros(..)
모든 요소를 0으로 초기화한다.
a = np.zeros((3,3)) # 또는 np.zeros([2,3]) a
Python
복사
array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]])
ones(..)
모든 요소를 1로 초기화한다.
b = np.ones((3,3), dtype='int32') b
Python
복사
array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
empty(..)
값을 초기화하지 않고(메모리 상태에 따라 다른 값이 들어감) 생성
c = np.empty((3,3)) c
Python
복사
array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]])
크기 지정하지 않고 순차적으로 값을 넣을 경우
크기 0인 배열 생성
np.append() 와 for문 사용
# 크기 0인 배열 생성 a = np.array([]) # for문과 append 내장함수 사용 for _ in range(3): a = np.append(a, [1,2,3]) a
Python
복사
array([ 1., 2., 3., 1., 2., 3., 1., 2., 3.])
단순한 시퀀스
arange(from, to, step)
from ~ to까지 step의 간격으로 데이터 생성
from(default = 0)과 step(default=1) 은 생략 가능
np.arange(1,2,0.1) np.arange(10) # 정수로 생성 np.arange(10.) # 실수로 생성
Python
복사
array([ 1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9]) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
linspace(from, to, npoints)
from ~ to까지 npoints개의 데이터를 등간격으로 생성
np.linspace(0.,20.,11) # 실수 0. ~ 20.의 범위에서 11개의 요소 값을 가지는 배열 생성
Python
복사
array([ 0., 2., 4., ..., 16., 18., 20.])
단위행렬
np.eye(3)
Python
복사
array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])

조건 조회

score= np.array([[78, 91, 84, 89, 93, 65], [82, 87, 96, 79, 91, 73]]) # 90이상인 요소 조회 print(score[score >= 90]) # 조건을 변수로 선언 con1 = score >= 90 print(score[con1]) # 여러 조건 ( & , | ) # 90이상 95미만인 요소 조회 print(score[(score >= 90) & (score < 95)])
Python
복사
[91 93 96 91] [91 93 91]

배열 연산

더하기 , 빼기, 곱하기, 나누기
함수를 사용하는 것과 단순 연산 기호(+, - , * , / , ** )를 사용하는 방법, 2가지로 나뉜다.
x = np.array([[1, 2], [3, 4]]) y = np.array([[5, 6], [7, 8]]) # 더하기 : np.add(x, y) / x + y print(x + y) print(np.add(x,y)) # 빼기 : np.substract(x,y) / x - y print(x - y) print(np.substract(x,y)) # 곱하기 : np.multiply(x,y) / x * y print(x * y) print(np.multiply(x, y)) # 나누기 : np.divide(x,y) / x / y print(x / y) print(np.divide(x,y)) # y제곱 : np.power(x,y) / x ** y print(x ** y) print(np.power(x,y))
Python
복사
[[ 6 8] [10 12]] [[-4 -4] [-4 -4]] [[ 5 12] [21 32]] [[0.2 0.33333333] [0.42857143 0.5 ]] [[ 1 64] [ 2187 65536]]
행렬곱
print(np.dot(x,y))
Python
복사
[[19 22] [43 50]]

선형회귀직선 생성하기

Numpy 는 선형회귀 직선을 만들기 위한 함수를 제공한다.
np.polyfit
: 직선을 구성하기 위한 계수, 절편값을 구해준다.
ex) fp1 = np.polyfit(data[’x축변수’], data[’y축변수’], 1) : 1차 선형회귀에 필요한 계수와 절편값을 구해줌.
np.poly1d
: polyfit 을 통해 구한 계수, 절편값을 넣어주면 자동으로 선형회귀 함수를 만들어준다.
ex) f1 = np.poly1d(fp1)
plt.plot( x, f1(x), ls=’—’, lw=2, color=’g’, … )

np.stack

NumPy 배열을 쌓아서 새로운 차원의 배열을 만드는 함수
주어진 배열들을 새 축(axis)을 따라 쌓아서, 기존 배열과 다른 차원의 배열을 생성
np.stack은 동일한 크기의 배열을 특정 축을 따라 합쳐야 할 때 유용
np.stack(arrays, axis=0)
arrays : 쌓고자 하는 배열들의 리스트나 튜플. 모든 배열들이 동일한 shape여야 함
axis : 새 축이 추가될 위치 지정. 기본값은 0으로 첫 번째 차원에 새 축이 추가됨
import numpy as np # 예제 배열 생성 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # axis=0으로 쌓기 result = np.stack((a, b), axis=0) print(result) # 출력: # [[1 2 3] # [4 5 6]] # axis=1로 쌓기 result = np.stack((a, b), axis=1) print(result) # 출력: # [[1 4] # [2 5] # [3 6]] # axis=-1로 쌓기 # axis=-1을 통해 마지막 차원에 새 축을 추가할 때 주로 데이터의 마지막 차원이 중요한 경우, # 특히 이미지 데이터나 시계열 데이터 등에서 유용하게 사용 result = np.stack((a, b), axis=-1) print(result) # 출력: # [[1 4] # [2 5] # [3 6]]
Python
복사
배열을 특정 차원으로 쌓아야 할 때는 np.concatenatenp.vstack, np.hstack 등의 다른 함수도 사용할 수 있다.