728x90
Numpy
- Python 에서 과학 계산을 위한 기본 패키지
- 다차원 배열(ndarray)을 다룹니다.
# Numpy 라이브러리 불러오기, 약칭 np
import numpy as np
- numpy 라이브러리는 정말 많이 쓰이기 때문에 암묵적인 룰로서 약칭을 np로 한다.
l = list(range(1,11))
print(l)
print(type(l))
- 1 부터 11을 제외한 정수까지 리스트로 l 에 할당한다.
- 1~10 까지의 정수가 나오며 이 l 의 타입은 list 이다.
array = np.array(l) # list 를 array로 만들어준다.
print(array)
print(type(array)) # vector
- 리스트인 l 을 np의 array메서드를 통해 array로 만들고 array 변수에 할당한다.
- array를 프린트하면, 리스트랑 비슷하게 나오지만 구분자인
,
가 없이 띄어쓰기로 나온다. - array의 타입은 <class 'numpy.ndarray'> 으로 출력된다.
# 리스트와 동일하게 이터러블 하다.
for i in array:
print(i)
for i in l:
print(i)
- 둘가 for문을 돌려서 하나씩 출력하면 동일하게 나온다.
l = [1,2.5,'Dog', True]
# 리스트는 각각 다른 데이터타입이 들어갈 수 있다.
for i in l:
print(type(i))
- 리스트에는 int, float, str, bool 등 다른 데이터 타입이 들어갈 수 있다.
a = np.array(l)
a
- 하지만 np.array를 이용하여 이 리스트를 array 로 만들면
# 배열(array)는 같은 데이터 타입만 들어갈 수 있다.
# 같은 데이터 타입이 아닐 경우 가능한 데이터 타입으로 자동으로 바꾼다.
for i in a:
print(type(i))
- array(배열)에는 리스트와 다르게 같은 데이터 타입만 들어갈 수 있기 때문에
- 각기 다른 데이터 타입이 같은 데이터 타입으로 통일이 된다.
- 위 l 리스트들의 타입이 array로 바꾸면 모든 안의 요소가 str(문자열) 이된다.
b = np.array([1.,'2',3])
b
type(b)
# dtype 어트리뷰트를 통해서 데이터타입을 확인할 수 있다.
b.dtype
- 리스트로 만들면 float, str,int 로 나와야할 타입들이
- araay로 만들어서 각각 문자열 데이터 타입으로 변한다.
넘파이 배열 백터화
# arange 메소드를 통해 새로운 배열 생성
np.arange(1,11)
# 시작 인덱스 = 0, 처음은 포함, 끝은 포함하지 않습니다.
np.arange(11)
np.arange(1,11,2)
- array도 리스트와 마찬가지로 range를 쓸 수 있다.
- np.arange()를 이용해 리스트와 동일한 방식으로 숫자 배열을 만든다.
l = [1,2,3,4]
l
l * 4
- 보통 리스트내의 요소들을 변화시키려면 그냥 리스트에 숫자를 곱하면
- 리스트 내의 요소들이 곱한만큼 반복되는거에 그친다.
li = []
for i in l:
li.append(i*2)
print(li)
[i*2 for i in li]
- 리스트 내의 값들을 하나하나 변경하고 싶으면 for문이나 리스트내for문을 이용하여 수행해야 한다.
# 리스트의 정수 덧셈은 불가하다.
# l + 2
a = np.arange(1,5)
a
a * 2 # 배열에서는 요소 하나하나의 곱셈 연산이 산술연산자로 가능
a + 2 # 배열에서는 요소 하나하나의 덧셈 연산이 산술연산자로 가능
a ** 2 # 제곱
np.sqrt(a) # 루트
np.log(a) # 로그
np.sum(a) # 합계
- 1~4까지의 배열을 a 에 할당한다.
- 배열에서는 모든 연산자가 재기능을 한다.
# 배열의 길이를 구하는 두가지 방법
len(a), a.size
- len()과 .size 를 통해서 해당 배열의 요소개수를 구할 수 있다.
# 절대값 구하기
b = np.array([-3,-1.5,-0.5, 0, 1, 3, 5.4])
np.abs(b)
- 배열도 리스트처럼 .abs() 함수를 통해서 절대값을 구할 수 있다.
# 올림
np.ceil(b)
# 내림
np.floor(b)
# 반올림
np.around(b)
배열의 인덱싱
a = np.arange(1,11)
a
# 첫번째 요소
a[0]
# 마지막 요소
a[-1]
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
를 a 에 할당한다.- a의 첫번째 요소인 1이 나온다.
- a의 마지막 요소인 10이 나온다.
# enumerate : (0:index, 1:value)
list(enumerate(a))
- enumerate는 해당값의 인덱스와 그 값을 튜플로 반환해 준다.
[(0, 1),(1, 2),(2, 3),(3, 4),(4, 5),(5, 6),(6, 7),(7, 8),(8, 9),(9, 10)]
이 출력된다.
# 슬라이싱
a[2:6]
# 끝자락 요소는 포함하지 않는다
a[:5]
# 처음 요소는 포함한다.
a[6:]
a[::2]
- a는
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
- 리스트의 슬라이싱이랑 동일하다
[start:end"step]
이 있다.
# 배열 내 요소값 변환
a[0] = 100
a
# 리스트와 다르게 한꺼번에 할당하는 것이 가능
a[2:5] = 50
a
a[2:5] = [50,51,52]
a
- 해당 배열의 특정 값을 임의의 값으로 변경시킬수 있다.
- 리스트와 다르게 한번에 바꿀 수도 있다.
- 바꿀 값도 한번에 지정해줄 수 있다.
a = np.arange(1,11)
a
b = a[2:8]
b
b[0] = 100
b
# 슬라이싱으로 새로운 변수에 참조한 경우,
# 슬라이싱 배열의 요소가 변경되면 기존 배열의 값도 같이 변경된다.
- a 배열을 슬라이싱하여 나온 값을 b에 할당할 경우
- a에게 할당받은 b의 값이 변경되면 a의 값도 같이 변경된다.
# 리스트의 경우, 슬라이싱 참조 리스트값이 변경되도
# 원본 리스트의 값이 변경되지 않는다.
l = list(range(1,11))
m = l[2:8]
m[0] = 100
print(m)
print(l)
- 배열과 달리 리스트의 경우 할당된 배열의 값을 바꾸어도 기존배열의 값은 바뀌지 않는다.
배열의 Shape,다차원
a = np.arange(1,13)
a
type(a)
- a 는
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
- a 의 타입은
numpy.ndarray
a.shape # 현재 차원과 구성요소를tuple 로 반환
# 행이 2개, 열이 6개인 2차원 배열로 변경
a = a.reshape(2,6)
a
a.shape
- .shape 메서드를 이용하여 현제 배열의 차원과 구성요소를 반환받을 수 있다.
- .reshpe를 이용해 행고 열을 지정하여 2차원배열로 변경할 수 있다.
# 행이 6개, 열이2개인 2차원 배열고 변경
a = a.reshape(6,2)
a
a.shape
a + 100 # 산술연산자가 작동한다.
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
를 6행 2열로 reshape한다.- 이때 변경된 배열에서도 산술연산자가 장동된다.
# 3차원 배열
a = a.reshape(2,2,3)
a
a.shape
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
- 2행 3열로 3차원 배열을 만든다.
# 한 줄로 메소드 체이닝하여 배열 생성 및 차원 조정 가능
b = np.arange(1,101).reshape(25,4)
b
array([[ 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, 30, 31, 32],
[ 33, 34, 35, 36],
[ 37, 38, 39, 40],
[ 41, 42, 43, 44],
[ 45, 46, 47, 48],
[ 49, 50, 51, 52],
[ 53, 54, 55, 56],
[ 57, 58, 59, 60],
[ 61, 62, 63, 64],
[ 65, 66, 67, 68],
[ 69, 70, 71, 72],
[ 73, 74, 75, 76],
[ 77, 78, 79, 80],
[ 81, 82, 83, 84],
[ 85, 86, 87, 88],
[ 89, 90, 91, 92],
[ 93, 94, 95, 96],
[ 97, 98, 99, 100]])
- 1부터 100까지의 수를 25행 4열의 배열로 만든다.
a = np.arange(1,13)
# 배열 요소의 순서를 변경하고 싶을 때
a.reshape(3,4, order='F')
array([[ 1, 4, 7, 10],
[ 2, 5, 8, 11],
[ 3, 6, 9, 12]])
a = a.reshape(3,4, order='C')
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
- 1에서12까지의 정수 배열을 3행 4열로 reshape한다.
- order속성인 'F'와 'C' 를 이용하여 순서를 변경 시킬 수 있다.
# 인덱싱을 할 경우 차원 축소
a[0]
# array([1, 2, 3, 4])
a[-1]
# array([ 9, 10, 11, 12])
- 3차원배열의 인덱싱을 할 경우 차원이 축소되어 2차원의 배열이 나온다.
# 차원축소 : 2d(행렬) -> 1d(백터) -> 0d(스칼라)
a[0][0]
- a[0]으로 한번 차원축소를하고 또 다시 [0]으로 차원축소를하면 3차원에서 1차원의 값이 나온다.
a[0][0]
은 첫번째 행의 첫번째 열 즉, 1이 나온다.
# 대괄호 하나로 여러 차원의 인덱싱 접근
a[1,1]
- 굳이 대괄호를 여러게 쓸 필요 없이 구분자를 이용하여 여러 차원의 인덱싱의 접근이 가능하다
- a의 두번째 행의 두번째 열의 값인 6이 나온다.
# 모든 행의 값, 첫번째 열의 값
a[:,0]
:,
은 모든 행의값을 뜻한다.- 즉, 모든행의 첫번째 열의 값을 반환한다.
- 3차원배열을 2차원 배열로 반환했으니
array([1, 5, 9])
가 출력된다.
# 2차원 각각 슬라이싱
a[:2,1:3]
- 두번째 행까지의 두번째 열부터 세번쩨 열까지 반환한다.
array([[2, 3], [6, 7]])
# 축을 변경한다 : Transpose -> 속성
a.T
# transpose 메소드
a.transpose()
- 원래 배열에서 왼쪽 위에서부터 오른쪽 아래까지 일직선을 축으로 반전 시킨다.
.T
와.transpose()
둘다 기능이다.
# 0 행렬 생성하기
np.zeros((5,5))
# 1 행열 생성하기
np.ones((5,5))
# 3차원 행열
np.zeros((2,3,4))
# 지정한 숫자로 채우는 행열
np.full((3,3),7)
# 단위 행열 만들기
np.eye(3)
- .zeros()는 값이 0인 행열 생성한다. 3차원 행열도 만들 수 있다.
- .ones()는 값이 1인 행열을 생성한다.
- .full을 이용하여 임의의 행열에 값을 정해줄 수 있다.
- 단위 행열을 만들수 있다.
a = np.arange(1,13).reshape(3,4)
# 다차원 행열 합계
a.sum()
# 행을 기준(축)으로 각 열의 합계
a.sum(axis=0)
# 열을 기준(축)으로 각 행의 합계
a.sum(axis=1)
- 다차원 행열을 sum으로 모든 행과 열의 값을 더해줄 수 있다.
- axis=0을 이용하여 행을 기준으로 각 열의 합을 구한다.
- axis=1을 이용하여 각 열을 기준으로 각 행의 합을 구한다.
# 누적합
a.cumsum()
a.cumsum(axis = 0)
a.cumsum(axis = 1)
- 점진적으로 다음 값을 한버씩 더하여 출력한다.
- axis를 이용하여 행이나 열을 축으로 누적시킬 수 있다.
# 내부 요소 전체 곱
a.prod()
a.prod(axis=0)
a.prod(axis=1)
- prod는 위의 행위를 곱으로 수행해 준다.
728x90
'Python' 카테고리의 다른 글
26-1. DataFrame(1) (Pandas) (0) | 2022.11.28 |
---|---|
25-2. Numpy(2) (0) | 2022.11.28 |
21. 크롤링 (0) | 2022.11.22 |
20. 네트워크 (0) | 2022.11.22 |
19. 정규식...(진짜 너무한다..) (0) | 2022.11.18 |