Python

[Python] Numpy 기초 이론 + 배열 생성

새발oi 2022. 2. 26. 18:01
반응형

Numpy

파이썬으로 과학 연산을 쉽고 빠르게 할 수 있게 만든 패키지

다차원 배열 데이터를 효과적으로 처리할 수 있음

자세한 정보는 공식홈페이지에서 확인 가능

https://numpy.org

 


배열 생성하기

 

배열(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
반응형