[Python] Numpy 기초 이론 + 배열 생성
Numpy
파이썬으로 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지
다차원 배열 데이터를 효과적으로 처리할 수 있음
자세한 정보는 공식홈페이지에서 확인 가능
배열 생성하기
배열(Array): 순서가 있는 같은 종류의 데이터가 저장된 집합
Numpy를 이용해 배열을 처리하기 위해서는 Numpy로 배열을 생성해야 함
Numpy는 파이썬의 내장 모듈이 아니므로 사용하려면 별도로 설치해야 하지만
colab에는 Numpy가 포함되어 있어 별도로 설치하지 않아도 됨
설치된 Numpy를 사용하기 위해 패키지 불러오기
import numpy as np
위와 같이 선언하면 Numpy를 이용할 때 np로 줄여서 작성할 수 있음
시퀀스 데이터((seq_data)로부터 배열 생성
시퀀스 데이터로 리스트와 튜플 타입의 데이터를 모두 사용할 수 있지만 주로 리스트 데이터를 이용
리스트로부터 Numpy의 1차원 배열을 생성하는 예시 - 정수로만 구성
data1 = [0,1,2,3,4,5]
a1 = np.array(data1)
a1
Out: array([0, 1, 2, 3, 4, 5])
리스트로부터 Numpy의 1차원 배열을 생성하는 예시 - 정수와 실수 혼합
data2 = [0.1, 5, 4, 12, 0.5]
a2 = np.array(data2)
a2
Out: array([ 0.1, 5. , 4. , 12. , 0.5])
- Numpy에서 인자로 정수와 실수가 혼합돼 있을 때 모두 실수로 변환
배열의 속성을 표현하려면
'ndarray.속성' 같이 작성하는데 ndarray는 Numpy의 배열 객체
배열 객체의 타입 확인 예시
a1.dtype
Out: dtype('int64')
a2.dtype
Out: dtype('float64')
array()에 리스트 데이터를 직접 넣어서 배열 객체 생성하기
np.array([0.5, 2, 0.01, 8])
Out: array([0.5 , 2. , 0.01, 8. ])
다차원 배열 생성하기
np.array([[1,2,3],[4,5,6],[7,8,9]])
Out: array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
범위를 지정해 배열 생성
arange()를 이용해 생성하는 방법
arr_obj = np.arange([start,] stop[, step])
위 예제는 start부터 시작해서 stop 전까지 step만큼 계속 더해 Numpy의 배열을 생성
배열을 생성할 때 간격을 설정
사용 예시
np.arange(0, 10, 2)
Out: array([0, 2, 4, 6, 8])
step이 1인 경우에는 생략해서 사용 가능 => 'numpy.arange(start, stop)'
np.arange(1, 10)
Out: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
start가 0인 경우에도 생략 가능 => 'numpy.arange(stop)'
np.arange(5)
Out: array([0, 1, 2, 3, 4])
.reshape(m,n) : 1차원 배열에서 2차원 배열(행렬)로 변경하기
- arange()로 생성되는 배열의 원소 개수와 reshape(m,n)의 m * n 개수는 같아야 함
예제
np.arange(12).reshape(4,3)
Out: array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
예제 배열의 형태 알아보기 'ndarray.shape'
b1 = np.arange(12).reshape(4,3)
b1.shape
Out: (4, 3)
4 * 3 행렬인 b1의 경우 (4, 3)이 출력되었음
1차원 배열의 경우에는 '(n,)' 의 형태로 표시됨
예제
b2 = np.arange(5)
b2.shape
Out: (5,)
linspace(): 데이터의 개수를 지정해 Numpy 배열을 생성
arr_obj = np,linspacce(start, stop[, num])
start부터 step까지 num개의 Numpy 배열을 생성
num을 지정하지 않으면 default는 50
1부터10까지 10개의 데이터 생성 예시
np.linspace(1, 10, 10)
Out: array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
0부터 PI까지 동일한 간격으로 나눈 20개의 데이터 생성 예시
np.linspace(0, np.pi, 20)
Out: array([0. , 0.16534698, 0.33069396, 0.49604095, 0.66138793,
0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284,
1.65346982, 1.8188168 , 1.98416378, 2.14951076, 2.31485774,
2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265])
arange와 linspace 차이점
arange
- 간격을 설정
- 미만으로 계산: 끝값이 데이터에 포함되지 않음
- start, step 생략 가능
linspace
- 개수를 설정
- 이하로 계산: 끝값이 데이터에 반드시 포함
- num 생략 가능 (default 50)
특별한 형태의 배열 생성
zeros() : 모든 원소가 0인 다차원 배열 생성
ones(): 모든 원소가 1인 다차원 배열 생성
arr_zero_n = np.zeros(n)
arr_zero_mxn = np.zeros((m,n)) # 2차원 배열 생성시
arr_one_n = np.ones(n)
arr_one_mxn = np.ones((m,n)) # 2차원 배열 생성시
예시
np.zeros(10)
Out: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,4))
Out: array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.ones(5)
Out: array([1., 1., 1., 1., 1.])
np.ones((3,5))
Out: array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
단위행렬(Identity matrix)
n x n인 정사각형 행렬에서 주 대각선이 모두 1이고 나머지는 0인 행렬
arr_I = np.eye(n)
예시
np.eye(3)
Out: array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
배열의 데이터 타입 변환
Numpy의 배열은 숫자뿐만 아니라 문자열도 원소로 가질 수 있음
예시
np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
Out: array(['1.5', '0.62', '2', '3.14', '3.141592'], dtype='<U8')
dtype: 데이터의 형식(타입)을 표시
'<U8': Numpy 데이터의 형식이 유니코드이며 문자의 수는 최대 8개라는 의미
* 데이터의 형식
기호 | 의미 |
'b' | 불, bool |
'i' | 기호가 있는 정수, (signed) integer |
'u' | 기호가 없는 정수, unsigned integer |
'f' | 실수, floating-point |
'c' | 복소수, complex-floating point |
'M' | 날짜, datetime |
'O' | 파이썬 객체, (Python) objects |
'S' 혹은 'a' | 바이트 문자열, (byte) string |
'U' | 유니코드, Unicode |
astype(): 배열의 형 변환
배열이 문자열(숫자 표시)로 되어 있다면 연산을 위해서는 숫자(정수 or 실수)로 변환해야 함
num_arr = str_arr.astype(dtype)
모든 요소를 지정한 데이터 타입(dtype)으로 변환함
실수가 입력된 문자열을 원소로 갖는 배열을 실수 타입으로 변환 예시
str_a1 = np.array(['1.567', '0.123', '5.123', '9', '8'])
num_a1 = str_a1.astype(float)
num_a1
Out: array([1.567, 0.123, 5.123, 9. , 8. ])
str_a1.dtype
Out: dtype('<U5')
num_a1.dtype
Out: dtype('float64')
데이터 타입이 변환된 것을 볼 수 있음
실수를 정수로 변환 예시
num_f1 = np.array([10, 21, 0.549, 4.75, 5.98])
num_i1 = num_f1.astype(int)
num_i1
Out: array([10, 21, 0, 4, 5])
num_f1.dtype
Out: dtype('float64')
num_i1.dtype
Out: dtype('int64')
난수 배열의 생성
rand(): (0,1) 사이의 실수 난수를 요소로 갖는 Numpy 배열을 생성
ex) rand(2,3) 수행시 (2,3) 형태를 보이는 2 x 3의 2차원 배열 실수 생성
randint(): 정수 난수를 요소로 갖는 Numpy 배열 생성
rand_num = np.random.rand([d0,d1, ..., dn]) # 인자가 없으면 임의의 실수 하나 생성
rand_num = np.random.randint([low,]high [size,]) # low 미입력시 0 / size 미입력시 1
rand() 예시
np.random.rand(2,3)
Out: array([[0.27897892, 0.20935546, 0.45602026],
[0.01744511, 0.43432381, 0.35187612]])
np.random.rand()
Out: 0.2489988973064916
np.random.rand(2,3,4)
Out: array([[[0.57277588, 0.80663431, 0.71928953, 0.87791697],
[0.71926125, 0.82491691, 0.46000723, 0.21499899],
[0.56766717, 0.61225993, 0.42469948, 0.477011 ]],
[[0.56276197, 0.19681183, 0.58638399, 0.17280172],
[0.88565475, 0.41931499, 0.26103819, 0.18327055],
[0.87545386, 0.80238761, 0.31958407, 0.00399506]]])
randint() 예시
np.random.randint(10, size=(3,4))
Out: array([[0, 5, 0, 6],
[2, 6, 8, 2],
[6, 5, 5, 0]])
np.random.randint(1, 30)
Out: 17