넘파이 특징
•
고속 연산에 유리
•
쉽고 빠른 배열 변환 가능
•
다양한 내장 함수 제공
•
성능향상을 위해 하나의 데이터 타입만 받을 수 있음
•
크기도 고정되어 있다.
왜 배열인가
→ 리스트의 각 요소에 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]
초기화 관련 편의함수
인자로는 배열의 차원을 list나 tuple 로 지정한다.
•
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.concatenate나 np.vstack, np.hstack 등의 다른 함수도 사용할 수 있다.