(Python 6강) numpy
210804
Numpy
Numerical Python
파이썬의 고성능 과학 계산용 패키지
Matrix와 Vector와 같은 Array연산의 표준
한글로 넘파이로 주로 통칭
특징
일반 List에 비해 빠르고 메모리 효율적이다
반복문 없이 데이터 배열에 대한 처리를 지원한다
선형대수와 관련된 다양한 기능을 제공한다
C, C++, 포트란 등의 언어와 통합 가능
ndarray
import numpy as np
numpy의 호출 방법
일반적으로 np라는 별칭 이용
test_array = np.array([1, 4, 5, 8], float)
print(test_array)
type(test_array[3])
numpy는 np.array 함수를 활용해서 배열을 생성하는데 이 배열을 ndarray 라고 한다
numpy는 하나의 데이터 타입만 배열에 넣을 수 있다.
리스트와의 차이점
dynamic typing을 지원하지 않는다고 한다
C의 Array를 사용하여 배열을 생성한다
array creation
파이썬은 임의의 위치에 저장되는데 비해 C언어는 순서대로 저장된다.
c언어의 지역성
또, 크기가 고정되어있다.
그래서, 속도가 빠른것
test_array = np.array([1, 4, 5, "8"], float) # String Type의 데이터를 입력해도
print(test_array)
array([ 1., 4., 5., 8.])
print(type(test_array[3])) # Float Type으로 자동 형변환을 실시
numpy.float64
print(test_array.dtype) # Array(배열) 전체의 데이터 Type을 반환함
dtype('float64')
print(test_array.shape)
(4,)
shape : ndarr의 dimension 구성을 반환
array의 크기, 형태에 대한 정보
dtype : ndarrr의 type을 반환
test_array = np.array([1, 4, 5, "8"], float) # String Type의 데이터를 입력해도
test_array.ndim
1
test_array.size
4
test_array.nbytes
16
ndim : number of dimensions
size : data 의 개수
nbytes : ndarray object의 메모리 크기를 반환함
int는 1byte, float은 4 bytes
파이썬에서 float은 8bytes가 기본이다. 위는 넘파이 기준
Handling shape
reshape : Array의 shape의 크기를 변경함. element의 갯수는 동일
test_matrix = [[1,2,3,4], [5,6,7,8]]
np.array(test_matrix).shape
>>> (2, 4)
np.array(test_matrix).reshape(8, )
>>> array([1,2,3,4,5,6,7,8])
np.array(test_matrix).reshape(-1, 2)
>>> array([[1, 2], [3, 4], [5, 6], [7, 8]]
-1
은 알아서 컴퓨터가 계산할 수 있는 부분을 의미한다
flatten : 다차원 array를 1차원 array로 변환
(2, 2, 4) => (16, )
indexing for numpy array
list와 달리 이차원 배열에서 [0, 0] 표기법을 제공한다
a[0, 0] == a[0][0]
둘 다 가능하다
또, list와 달리 행과 열 부분을 나눠서 slicing이 가능하다
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
a[:, 2:]
>>> array([[3, 4, 5], [8, 9, 10]])
a[1, 1:3]
>>> array([7, 8])
Create Functions
arange
array의 범위를 지정하여 값의 list를 생성하는 명령어
np.arrange(30)
>>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
#시작, 끝, step => 이 때 step은 정수형일 필요는 없음
np.arange(0, 5, 0.5)
>>> array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
np.arange(30).reshape(5, 6)
>>> array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29]])
zeros
0으로 가득찬 ndarr 생성
>>> np.zeros((2, 5), int)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
>>> np. zeros((3, ), float)
array([0., 0., 0.])
ones
1로 가득찬 ndarr 생성
>>> np.ones((1, 1, 1), int)
array([[[1]]])
>>> np.ones((2, 3, 2, 3), int)
array([[[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]]],
[[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]],
[[1, 1, 1],
[1, 1, 1]]]])
empty
shape만 주어지고 비어있는 ndarr 생성
memory initialization이 된 것은 아니다
이미 존재하는 값은 이전에 사용하던 쓰레기값이다
>>> np.empty((3, 5))
array([[2.12199579e-314, 6.36598737e-314, 1.06099790e-313,
1.48539705e-313, 1.90979621e-313],
[2.33419537e-313, 2.75859453e-313, 3.18299369e-313,
3.60739285e-313, 4.03179200e-313],
[4.45619116e-313, 4.88059032e-313, 5.30498948e-313,
5.72938864e-313, 6.15378780e-313]])
somthing_like
기존 ndarr의 shape 크기만큼 1 또는 0의 array 반환
>>> test = np.arange(12).reshape(3, 4)
>>> test
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.zeros_like(test)
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
>>> np.ones_like(test)
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
identity
단위행렬 생성
>>> np.identity(4, dtype=np.float32)
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
eye
대각선이 1인 행렬 생성.
identity와 다른점은 시작위치를 정할 수 있다
np.eye(3, 5, k=2)
면 2만큼 이동된 3 * 5 행렬 생성
>>> np.eye(3, 5, k=2)
array([[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
diag
대각 행렬의 값을 추출함
>>> test
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.diag(test)
array([ 0, 5, 10])
>>> np.diag(test, k=2)
array([2, 7])
random sampling
데이터 분포에 따른 sampling으로 array를 생성
# 시작, 끝, 개수
>>> np.random.uniform(0, 1, 10)
array([0.46238198, 0.10681686, 0.0266183 , 0.60596315, 0.41614435,
0.99164157, 0.4245724 , 0.87679971, 0.37257856, 0.31018757])
# 균등 분포
>>> np.random.uniform(0, 1, 10).reshape(2, 5)
array([[0.16017842, 0.70721719, 0.79159583, 0.95743024, 0.77892252],
[0.38001109, 0.21918138, 0.59308826, 0.56590121, 0.31633467]])
# 정규 분포
>>> np.random.normal(0, 1, 10).reshape(2, 5)
array([[-0.15451055, 0.35729475, 0.07026103, -0.68009187, -0.68631985],
[ 0.37181644, -0.92405456, 0.50774203, 0.87155016, 1.48159822]])
Operation functions
sum
element간의 합
axis
모든 operation function을 실행할 때 기준이 되는 dimension 축이다.

mathematical functions
다양한 수학 연산자
np.exp
np.sqrt
np.mean
np.std
Concatenate
vstack
numpy array를 세로로 붙임
hstack
numpy array를 가로로 붙임
concatenate
axis = 0 : vstack과 동일
axis = 1: hstack과 동일
newaxis
축을 하나 늘린다
b = np.array([5, 6])
b = b[np.newaxis, :]
b
>>> array([[5, 6]])
Opertaions b/t arrays
기본적으로 numpy array간의 기본적인 사칙 연산을 지원한다
이 때 element-wise operation으로 연산된다
dot product
내적 함수
np.array.dot(np.array)
꼴로 사용
transpose
전치 함수
np.array.T
의 꼴로 사용
broadcasting
shape이 다른 배열 간 연산을 지원하는 기능
scalar - vector 와 vector - matrix 간에 지원한다
timeit
jupyter 환경에서 코드의 퍼포먼스를 체크하는 함수
일반적으로 속도는 다음과 같다
numpy > list comprehension > for loop
Comparisons
All & Any
Array의 데이터 전부 또는 일부가 조건에 만족하는지에 대한 여부를 반환한다
a = np.arange(10)
a
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.any(a>5), np.any(a<0)
>>> (True, False)
np.all(a>5), np.all(a<10)
>>> (False, True)
numpy는 배열의 크기가 동일한 element간 비교의 결과를 Boolean type으로 반환한다.
test_a = np.array([1, 3, 0], float)
test_b = np.array([5, 2, 1], float)
test_a > test_b
>>> array([False, True, False], dtype=bool)
where
a = np.arange(10)
np.where(a>5)
>>> (array([6, 7, 8, 9], dtype=int64),)
a = np.array([1, np.NaN, np.Inf], float)
np.isnan(a)
>>> array([False, True, False])
np.isfinite(a)
>>> array([ True, False, False])
argmax & argmin
array내 최대값 또는 최소값의 index를 반환
또한, axis 기반의 반환을 할 수 있다
a = np.arange(0, 20, 3)
a
>>> array([ 0, 3, 6, 9, 12, 15, 18])
np.argmax(a), np.argmin(a)
>>> (6, 0)
a = np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
np.argmax(a, axis=1), np.argmax(a, axis=0)
>>> (array([3, 1, 1], dtype=int64), array([1, 1, 1, 1], dtype=int64))
np.argmin(a, axis=1), np.argmin(a, axis=0)
>>> (array([0, 2, 2], dtype=int64), array([0, 0, 2, 2], dtype=int64))
boolean index
특정 조건에 따른 값을 배열 형태로 추출한다.
arr > 3
>>> array([False, True, False, False, False, True, True, True])
arr[arr > 3]
>>> array([4., 8., 9., 7.])
fancy index
numpy array를 index value로 사용해서 값을 추출한다. 이 때 인덱스로 사용되는 배열은 반드시 정수로 선언되어야 한다.
a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)
a[b]
>>> array([2., 2., 4., 8., 6., 4.])
matrix형태도 가능하다
a[b][c]
Last updated
Was this helpful?