Python

Lyoka료카·2023년 3월 29일
0

python 자료

목록 보기
1/3
post-thumbnail

numpy의 장점은?

NumPy Array는 대량의 데이터에 대한 고급 수학적 및 기타 유형의 작업을 용이하게 합니다.
일반적으로 Python의 기본 제공 기능을 사용하여 가능한 것보다 적은 코드로 보다 효율적으로 작업 수행할 수 있습니다.
NumPy를 쓰는 메인 이유라고 할 수 있습니다. 훨씬 효율적이고 쉽게 코딩할 수 있습니다.

array와 list의 차이

Array는 정적 할당에 해당하며, List의 경우는 동적 할당에 해당합니다.
Python List와 달리 NumPy Array는 고정된 크기를 갖습니다.
Size를 변화하면 기존의 array를 삭제하고 새로운 array를 생성해야 합니다.


1. numpy package

numpy는 과학 계산을 위한 라이브러리
다차원 배열을 처리하는데 필요한 여러 유용한 기능을 제공함
numpy는 pip을 사용하여 간단히 설치할 수 있다.

pip3 install numpy # pip는 자신이 설치한 Python버전에 맞게 사용한다. pip, pip3


2. numpy 배열

배열(array) 은 컴퓨터에서 일반적으로 사용하는 개념으로 수를 포함한 어떤 데이터의 묶음을 의미한다.
벡터(vector) 는 N * 1 차원의 행렬이다. 행만 구성된 것을 행백터, 열만으로 구성된 것을 열벡터라 부른다.
행렬(Matrix) 이란 직사각형 모양의 숫자의 배열이며, 다량의 데이터에 대한 계산을 편리하게 하는 것이 목적이다.

numpy에서 배열은 동일한 타입의 값들을 가진다.
배열의 차원을 rank 라 하고, 각 차원의 크기를 tuple로 표시하는 것을 shape 라 한다.

행 = rank 열 = shape 이라고 생각하면 편하다.

numpy 예제)

import numpy as np

list1 = [1, 2, 3, 4]
a = np.array(list1)
print(a.shape) # (4, )

b = np.array([[1,2,3],[4,5,6]])
print(b.shape) # (2, 3)
print(b[0,0])  # 1

위 예제에서 list1은 4개의 요소를 갖는 리스트인데,
이를 array() 함수에 넣어 numpy배열을 생성하는 것이다.
이 배열의 rank는 1이 되고, shape는 (4,)가 된다.

튜플은 하나의 요소만 있으면 문법상 콤마를 뒤에 붙인다.

두 번째 배열은 2X3 배열로서 shape은 (2,3)이 된다.

<주의사항>
array()안에 하나의 리스트만 들어가기 때문에 여러개의 리스트를 사용하려면 하나의 리스트안에 넣어야 한다.


numpy에서 제공하는 함수

zeros(), ones(), full(), eye() 등 있다.

1. zeros()

zeros()는 해당 배열에 모두 0을 집어 넣는다.

import numpy as np
 
a = np.zeros((2,2))
print(a)
# 출력:
# [[ 0.  0.]
#  [ 0.  0.]]

2. ones()

ones()는 해당 배열에 모두 1을 집어 넣는다.

import numpy as np

a = np.ones((2,3))
print(a)
# 출력:
# [[ 1.  1.  1.]
#  [ 1.  1.  1.]]

3. full()

full()은 배열에 사용자가 지정한 값을 넣는다.

import numpy as np

a = np.full((2,3), 5)
print(a)
# 출력:
# [[5 5 5]
#  [5 5 5]]

4. eye()

eye()는 대각선으로는 1이고 나머지는 0인 2차원 배열을 생성한다.

import numpy as np

a = np.eye(3)
print(a)
# 출력:
# [[ 1.  0.  0.]
#  [ 0.  1.  0.]
#  [ 0.  0.  1.]]

5. reshape()

reshape()는 배열을 다차원으로 변형시킨다.

import numpy as np

a = np.array(range(20)).reshape((4,5))
print(a)
# 출력:
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]

range(n) 함수와 reshape()를 통해 간단하게 샘플 배열을 생성한 것이다.
range로 가져온 정수들을 reshape를 통해 [행,열]을 나눈 것이다.


numpy 슬라이싱

numpy 배열은 파이썬 리스트와 마찬가지로 슬라이스(Slice)를 지원한다.
numpy 배열을 슬라이싱하기 위해서는 각 차원별로 슬라이스 범위를 지정한다.

슬라이싱 예제)

import numpy as np
 
lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
arr = np.array(lst)
 
# 슬라이스
a = arr[0:2, 0:2]
print(a)
# 출력:
# [[1 2]
#  [4 5]]
 
a = arr[1:, 1:]
print(a)
# 출력:
# [[5 6]
#  [8 9]]

numpy 정수 인덱싱(integer indexing)

정수 인덱싱은 각 차원별로 선택되어지는 배열요소의 인덱스들을 일렬로 나열하여 부분집합을 구하는 방식이다.
즉 임의의 numpy 배열 a에 대해 a[[row1.row2],[col1,col2]] 와 같은 표현 방식이다

이는 a[row1, col1] 과 a[row2, col2] 라는 두 개의 배열요소의 집합을 의미한다.

정수 인덱싱 예제)

import numpy as np
 
lst = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]
a = np.array(lst)
 
# 정수 인덱싱
s = a[[0, 2], [1, 3]]
 
print(s)
# 출력
# [2 12]

numpy 부울린 인덱싱(boolean indexing)

numpy 부울린 인덱싱은 배열 각 요소의 선택여부를 True, False로 표현하는 방식이다.
예를 들어 배열 a가 2X3의 배열이라면, 부울린 인덱싱을 정의하는 numpy 배열도 2X3 으로 만들고 선택할 배열요소에 True를 넣고 그렇지 않으면 False를 넣으면 된다.

부울린 인덱싱 예제)

import numpy as np
 
lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
a = np.array(lst)
 
bool_indexing_array = np.array([
    [False,  True, False],
    [True, False,  True],
    [False,  True, False]
])
 
n = a[bool_indexing_array];
print(n)    

부울린 인덱싱 배열에 일일이 True/False 값을 지정하는 방법 이외에 표현식을 사용하여 부울린 인덱싱 배열을 생성하는 방법도 있다.

예제2)

import numpy as np
 
lst = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
a = np.array(lst)
 
# 배열 a 에 대해 짝수면 True, 홀수면 False 
bool_indexing = (a % 2 == 0)
 
print(bool_indexing)
# 출력: 부울린 인덱싱 배열
# [[False  True False]
#  [ True False  True]
#  [False  True False]]
 
# 부울린 인덱스를 사용하여 True인 요소만 뽑아냄
print(a[bool_indexing])
# 출력:
# [2 4 6 8]
 
# 더 간단한 표현
n = a[ a % 2 == 0 ]
print(n)

마지막에 a[ a % 2 == 0 ] 와 같이 부울린 인덱싱 표현식을 배열 인덱스안에 넣어 간단하게 표현할 수도 있다.


numpy 연산

numpy를 사용하면 배열간 연산을 쉽게 실행할 수 있다.
연산은 +,-,*,/ 등의 연산자를 사용할 수 있고 add(), substract(), multiply(), divide() 등의 함수를 사용할 수도 있다.

연산 예제)

import numpy as np
 
a = np.array([1,2,3])
b = np.array([4,5,6])
 
# 각 요소 더하기
c = a + b
# c = np.add(a, b)
print(c)  # [5 7 9]
 
# 각 요소 빼기
c = a - b
# c = np.subtract(a, b)
print(c)  # [-3 -3 -3]
 
# 각 요소 곱하기
# c = a * b
c = np.multiply(a, b)
print(c)  # [4 10 18]
 
# 각 요소 나누기
# c = a / b
c = np.divide(a, b)
print(c)  # [0.25 0.4 0.5]

numpy에서 vector와 matrix의 product를 구하기 위해 dot() 함수를 사용한다. 아래 예제는 두 matrix의 product를 구한 예시다.

dot() 함수 예제)

import numpy as np
 
lst1 = [
    [1,2],
    [3,4]
]
 
lst2 = [
    [5,6],
    [7,8]
]
a = np.array(lst1)
b = np.array(lst2)
 
c = np.dot(a, b)
print(c)
# 출력:
# [[19 22]
#  [43 50]]  

[1,2][5,7] => [1*5]+[2*7] = 19
[1,2][6,8] => [1*6]+[2*8] = 22
[3,4][5,7] => [3*5]+[4*7] = 43
[3,4][6,8] => [3*6]+[4*8] = 50

numpy는 배열간 연산을 위해 함수를 많이 제공하고 있다.
각 배열 요소를 더하는 sum() 함수, 각 배열 요소들을 곱하는 prod() 함수 등을 사용할 수 있다.
이들 함수에 선택옵션으로 axis을 지정할 수 있는데,
예를 들어 sum()에서 axis가 1이면 행끼리 더하는 것, axis가 0이면 열끼리 더하는 것

예제)

import numpy as np
 
a = np.array([[1,2],[3,4]])
 
s = np.sum(a)
print(s)   # 10
 
# axis=0 이면, 컬럼끼리 더함
# axis=1 이면, 행끼리 더함
s = np.sum(a, axis=0)
print(s)   # [4 6]
 
s = np.sum(a, axis=1)
print(s)   # [3 7]
 
s = np.prod(a)
print(s)   # 24

개인적으로 궁금하여 type을 출력해 보았더니 <class 'numpy.ndarray'> 라는 타입이였다.


profile
고딩 프로그래머

0개의 댓글