- numpy는 파이썬으로 진행되는 모든 데이터 분석과 인공지능 학습에 있어 가장 필수적으로 이해해야 하는 도구이다
- Numpy는 Numerical Python의 약자로 일반적으로 과학계산에서 많이 사용하는 선형대수의 계산식을 파이썬으로 구현할 수 있는도록 도와주는 라이브러리 이다
- Numpy는 numpy 자체로도 많이 사용되지만 이후에 사용되는 SciPy나 Pandas의 base객체로도 사용되며 numpy에서 사용된느 다양한 코드 표현법을 pytorch와 tensorflow에 사용하는 경우가 많아 numpy의 활용법은 반드시 알아둘 필요가 있다
파이썬의 고성능 과학 계산용 패키지
Matrix와 Vector와 같은 Array 연산의 사실상의 표준
일반 list에 비해 빠르고, 메모리 효율적
반복문 없이 데이터 배열에 대한 처리를 지원함
선형대수와 관련된 다양한 기능을 제공함
C, C++, 포트란 등의 언어와 통합 가능
array creation
test_array = np.array(["1",4.0,5,6], float)
print(test_array) # array([1., 4., 5., 8.])
print(type(test_array[0]) # numpy.float64
python list
numpy array
import numpy as np
a = [1, 2, 3, 4, 5]
b = [5, 4, 3, 2, 1]
a[0] is b[-1] # True
a = np.array(a)
b = np.array(b)
a[0] is b[-1] # False
numpy array 용어
array shape
Rank | Name | Exampe |
---|---|---|
0 | scalar | 7 |
1 | vector | [10, 10] |
2 | matrix | [[10, 10], [15,15]] |
3 | 3-tensor | [[[1,5,9], [2,6,10]], [[3,5,11],[4,8,12]]] |
n | n-tensor |
array shape (3rd order tensor)
array nbytes
test_matrix = [[1,2,3,4], [1,2,5,8]]
np.array(test_matrix).shape # (2,4)
np.array(test_matrix).reshape(8,)
# array([1,2,3,4,1,2,5,8])
np.array(test_matrix).reshape(2,4).shape # (2,4)
np.array(test_matrix).reshape(-1, 2).shape # (4,2). -1 : size를 기반으로 row 개수 선정
np.array(test_matrix).reshape(2,2,2) # [[[1,2],[3,4]],[[1,2],[5,8]]]
np.array(test_matrix).(1,-1,2).shape # (1,4,2)
a = np.array([[1, 2, 3], [4.5, 5, 6]], int)
print(a) # array([[1,2,3],[4,5,6]])
print(a[0,0]) # 1)Two dimensional array representation
print(a[0][0]) # 2)Two dimensional array representation
a[0,0] = 12 # Matrix 0,0 에 12 할당
print(a) # array([[12,2,3],[4,5,6]])
a[0][0] = 5 # Matrix 0,0 에 12 할당
print(a) # array([[5,2,3],[4,5,6]])
import numpy as np
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
print(a[:,2:]) # 전체 Row의 2열 이상 # [[3,4,5],[8,9,10]]
print(a[1,1:3]) # 1 Row의 1열 ~ 2열 # [7,8]
print(a[1:3]) # 1 Row ~ 2Row의 전체 # [[6,7,8,9,10]]
import numpy as np
print(np.arange(10)) # range : list의 range와 같은 효과, integer로 0부터 29까지 배열 추출 # [0 1 2 3 4 5 6 7 8 9]
print(np.arange(0,5,0.5)) # floating point 도 표시가능함. np.arange(시작, 끝, step) # [0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5]
print(np.arange(15).reshape(5,-1)) # [[0,1,2],[3,4,5],[6,7,8],[9,10,11],[12,13,14]]
np.zeros(shape = (10,), dtypes = np.int8) # 10 - zero vector 생성
# array([0,0,0,0,0,0,0,0,0,0], dtype = int8)
np.zeros((2,5)) # 2 by 5 - zeros matrix 생성
import numpy as np
test_matrix = np.arange(9).reshape(3,3)
np.ones_like(test_matrix) # [[1,1,1],[1,1,1],[1,1,1]]
import numpy as np
np.identity(n=3, dtype=np.int8)
# [[1,0,0]]
# [0,1,0]]
# [0,0,1]]
- ndarray element들 간의 여러가지 연산을 할 때 활용하는 함수들
- 연산을 어떻게 지원을 해주는지 알아야 한다
- axis 개념을 알아야 한다
test_array = np.arange(1,11)
test_array.sum(dtype = np.float) # 55.0
import numpy as np
a = np.array([[1,2,],[3,4]])
b = np.array([5,6])
b = b[np.newaxis, :] # 값은 그대로면서 축이 하나 추가 or b = b.reshape(-1,2)
print(b) # [[5,6]]
np.concatenate((a,b.T), axis=1) # [[1,2,5],[3,4,6]]
or
import numpy as np
a = np.array([[1,2,],[3,4]])
b = np.array([5,6])
b = b[: ,np.newaxis] # 값은 그대로면서 축이 하나 추가 or b = b.reshape(2,-1)
print(b) # [[5],[6]]
np.concatenate((a,b), axis=1) # [[1,2,5],[3,4,6]]
o
test_a = np.arange(1,7).reshape(2,3) # [[1,2,3],[4,5,6]]
test_a.transpose() # [[1,4],[2,5],[3,5]]
test_a.T.dot(test_a) # matrix간 곱셈
import numpy as np
def sclar_vector_product(scalar, vector):
result = []
for value in vector:
result.append(scalar * value)
return result
iternation_max = 100000000
vector = list(range(iternation_max))
scalar = 2
%timeit sclar_vector_product(scalar, vector) # for loop을 이용한 성능
%timeit [scalar * value for value in range(iternation_max)]
# list comprehension을 이용한 성능
%timeit np.arange(iternation_max) * scalar # numpy를 이용한 성능
a = np.arange(10)
print(a) # array([0,1,2,3,4,5,6,7,8,9])
np.any(a>5) # True
np.any(a<0) # False # any -> 하나라도 조건에 만족한다면 True
np.all(a>5) # False
np.all(a<10) # True # all -> 모두가 조건에 만족한다면 True
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)
(test_a > test_b).any() # True
a = np.array([1,3,0], float)
np.logical_and(a>0, a<3) # and 조건의 condition
# array([True, False, False], dtype=bool)
b = np.array([True,False,True], bool)
np.logical_not(b) # Not 조건의 condition
# array([False, True, False], dtype = bool)
c = no.array([False, True, False], bool)
np.logical_or(b,c) # or 조건의 condition
# array([True, True, True], dtype = bool)
# np.where
import numpy as np
a = np.arange(5)
np.where(a>2, 'Correct', 'Wrong') # where(condition, True, False)
# array(['Wrong', 'Wrong', 'Wrong', 'Correct', 'Correct'], dtype='<U7')
a = np.arange(10)
np.where(a>5) # array([6,7,8,9]) # index 값 반환
a = np.array([1, np.NaN, np.Inf], float) # Not a Number
np.isnan(a) # array([False, True, False], dtype = bool)
np.isfinite(a) # is finite number
array([True, False, False], type=bool)
#array 내 최대값 또는 최소값의 index를 반환함
a = np.array([1,2,3,4,5,6,78,23,3])
np.argmax(a) # 5
np.argmin(a) # 0
#axis 기반의 반환
a = np.array([[1,2,4,7],[9,88,6,45],[9,76,3,4]])
np.argmax(a, axis= 1) # array([3,1,1])
np.argmax(a, axis=0) # array([0,0,2,2])
a = np.loadtxt('./populations.txt') # 파일 호출
a_int = a.astype(int)
a_int[:3] # int type 변환
np.savetxt('int_data.csv', a_int, delimiter=',') # int_data.csv 로저장
- 벡터의 기본 개념과 연산, 노름에 대해 소개
- 두 벡터 사이의 거리와 각도, 그리고 내적에 대해 설명
- 벡터는, 딥러닝에서 매우 중요한 선형대수학의 기본 단위가 되고, 앞으로 배울 numpy에서도 굉장히 많이 사용되는 연산이기 때문에 확실히 알아야 함!!
- 벡터간의 연산을 단순히 숫자 계산으로 끝내기보단, 공간에서 어떤 의미를 가지는지를 이해하는 것이 중요!
- 노름이나 내적 같은 개념 또한, 그 자체로 가지는 기하학적인 성질과 이것이 실제 머신러닝에서 어떻게 사용되는지를 생각!!
각각의 벡터마다 차원의 갯수를 정의를 한다
벡터 (cont.)
- 어떤 한 벡터가 있을 때 그 벡터에 scalar 또는 숫자를 곱해주게 되면 방향은 그대로고 벡터의 길이만 변형되는데 이 연산을 스칼라곱 이라고 부른다
- 스칼라곱의 의미 - 주어진 벡터의 길이를 변형 시키는 것으로써 만약의 숫자의 크기가 1보다 크면 원래 벡터의 길이를 더 길게 변화를 시키는 것이고 만약 1보다 작다면 원래 벡터의 길이를 1보다 작은 크기로 줄인다
- 만약에 곱해주는 실수의 값이 0 보다 작다면 이 때는 벡터가 같은 방향으로 가지 않고 반대 방향으로 가게 된다
- 정리 - 원점에서 그 벡터를 표현하는 화살표를 스칼라곱을 통해서 길이를 변형 시켜주는 연산
노름 이라는 기호는 1,2,3 차원을 성립하는 것이 아니라 임의의 차원 d에 대해서 성립한다는 것을 명심!
L1 : 노름은 각 성분의 변화량의 절대값 을 모두 더한다
!
def angle(x,y):
v = np.inner(x,y) / (12_norm(x) * 12_norm(y))
theta = np.arccos(v)
return theta
- 행렬의 개념과 연산, 그리고 벡터공간에서 가지는 의미를 설명
- 연립방정식 풀기와 선형회귀분석에 응용하는 방법 소개
- 벡터의 확장된 개념인 행렬은 행(row)벡터를 원소로 가지는 2차원 배열로 벡터와 다르게 계산되는 연산들에 주의
- 행렬연산은 딥러닝에서 가장 핵심적인 연산이라고 볼 수 있을만큼 중요하고, 자주 사용되기 때문에 행렬 연산의 메커니즘, 그리고 이 때 가지는 기하학적 의미와 머신러닝에서 어떻게 사용되는지를 충분히 이해하고 넘어가자
행렬(matrix)은 벡터를 원소를 가지는 2차원 배열
보통 열 벡터를 원소로 가지는 2차원 배열이지만 파이썬에서 넘파이를 이용할 때는 행 벡터를 원소로 가지는 2차원 배열로 이해를 하자
행렬의 전치행렬 (Transpose)
행렬을 이해하는 방법 (1)
행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱
행렬 곱셈
import numpy as np
X = np.array([[1,-2,3],[7,5,0],[-2,-1,2]])
np.linalg.inv(X) # X의 역행렬
X @ np.linalg.inv(X)
Y = np.array([[0,1],[1,-1],[-2,1]])
np.linalg.pinv(Y)
np.linalg.pinv(T) @ Y
응용1: 연립방정식 풀기
응용2: 선형회귀분석