차곡차곡

[Python] Numpy 본문

2021 데이터 청년 캠퍼스/기초 파이썬

[Python] Numpy

sohy 2021. 7. 4. 03:00

Numpy

수치해석용 python 패키지로 데이터 분석 패키지들의 기초가 된다. (SciPy, Pandas, Matplotlib, Tensorflow, PyTorch, Keras, ...)

 

[행렬 생성]

 - List로부터 (쉼표 없이 출력됨)

a = numpy.array([1, 2])
print(a)

>> [1 2]

 

- 함수 사용

a = numpy.zeros((3, 2))
print(a)

>> [[0. 0.]
       [0. 0.]
       [0. 0.]]
    
a = numpy.ones((3, 2))
print(a)

>> [[1. 1.]
       [1. 1.]
       [1. 1.]]

 

- 단위행렬 (Identity matrix)

a = numpy.identity(3)
print(a)

>> [[1. 0. 0.]
       [0. 1. 0.]
       [0. 0. 1.]]

 

- numpy.arange(시작, 끝-미포함, 간격) : range와 비슷

a = numpy.arange(10, 20, 2)
print(a)

>> [10 12 14 16 18]

 

- numpy.linspace(시작, 끝-포함, 등분 개수) : 각 요소들이 동일한 간격을 갖도록 생성

a = numpy.linspace(0, 5, 5)
print(a)

>> [0.   1.25 2.5  3.75 5.  ]

 

 

[행렬 변형]

- numpy.reshape(행, 열) : 값이 들어있는 기존 행렬의 직사각형 모양을 변형, 1차원 배열을 다차원 배열로 바꿔준다.

* 인자 중 하나에 -1을 넣으면 입력한 행/열로만 정렬된다. 각 인수엔 약수를 넣어야 한다.

a = numpy.arange(12)
print(a)

>> [ 0  1  2  3  4  5  6  7  8  9 10 11]

a = a.reshape(2, 6)
print(a)

>> [[ 0  1  2  3  4  5]
       [ 6  7  8  9 10 11]]
    
a = a.reshape(-1, 4)
print(a)

>> [[ 0  1  2  3]
       [ 4  5  6  7]
       [ 8  9 10 11]]

 

- 전치행렬

a = numpy.arange(12)
a = a.reshape(3, 4)
print(a)

>> [[ 0  1  2  3]
       [ 4  5  6  7]
       [ 8  9 10 11]]

a = a.transpose()
print(a)
 
>> [[ 0  4  8]
       [ 1  5  9]
       [ 2  6 10]
       [ 3  7 11]]

 

 

[행렬 연산]

- 행렬과 숫자 간 연산

a = np.arange(12)
a = a.reshape(3, 4)
print(a)

>> [[ 0  1  2  3]
       [ 4  5  6  7]
       [ 8  9 10 11]]

print(a + 2)
>> [[ 2  3  4  5]
       [ 6  7  8  9]
       [10 11 12 13]]
    
print(a ** 2)
>> [[  0   1   4   9]
       [ 16  25  36  49]
       [ 64  81 100 121]]

 

- 행렬 간 연산 : 모양이 동일한 행렬이면 각 원소끼리 연산된다.

a = numpy.array([[1, 1], [0, 1]])
b = numpy.array([[2, 1], [3, 4]])

print(a + b)
>> [[3 2]
       [3 5]]
    
print(a - b)
>> [[-1  0]
       [-3 -3]] 
     
print(a * b)
>> [[2 1]
       [0 4]]

print(a / b)
>> [[0.5  1.  ]
       [0.   0.25]]

 

- 행렬 곱셈 : a @ b / a.dot(b) / numpy.dot(a, b)

print(a @ b)
>> [[5 5]
       [3 4]]

 

- 역행렬 (inverse matrix) : numpy 내 선형대수 패키지(linalg : linear algebra) 사용

a = numpy.array([[1, 1], [0, 1]])
print(numpy.linalg.inv(a))

>> [[ 1. -1.]
       [ 0.  1.]]

 

- 행렬식 (determinant) : numpy 내 선형대수 패키지(linalg : linear algebra) 사용

a = numpy.array([[1, 1], [0, 1]])
print(numpy.linalg.det(a))

>> 1.0

 

- 대소 비교

a = numpy.arange(12)
a = a.reshape(3, 4)
print(a > 5)

>> [[False False False False]
       [False False  True  True]
       [ True  True  True  True]]

 

 

[행렬 자르기]

- 2차원 자르기

a = numpy.arange(12)
a = a.reshape(3, 4)

print(a[1:, ::2])   #1행부터 끝행까지, 0열부터 끝열 전까지 2열씩 점프
>> [[ 4  6]
       [ 8 10]]
    
print(a[:, 1:2])    #0행부터 끝행까지, 1열부터 2열 전까지
>> [[1]
       [5]
       [9]]

print(a[1, :-1:2])  #1행만, 0열부터 -1열 전까지 2열씩 점프
>> [4 6]

print(a[0:-2, ::3]) #0행부터 -2행 전까지, 0열부터 끝열 전까지 3열씩 점프
>> [[0 3]]

 

 

[실습]

다음과 같은 numpy 행렬을 만들고 A행렬을 잘라서 연두색으로 표시된 요소들만 갖도록 표현하기

import numpy as np

A = np.arange(11, 35).reshape(4, -1)
print(A)

print(A[:2, 3:])
print(A[::2])
print(A[:,4])
print(A[:,1::3])
print(A[::2, 1::2])
Comments