boot camp day4

HIROYOSHI·2022년 2월 3일
0

2022/02/03

numpy

NumPy는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬의 라이브러리입니다. NumPy는 데이터 구조 외에도 수치 계산을 위해 효율적으로 구현된 기능을 제공합니다.
numpy를 import하는 방법은

import numpy as np

as를 사용해주는 이유는 numpy를 사용할 때마다 numpy라고 쓰기에는 너무 길기 때문에 편하게 쓰기 위해서 np라고 별명을 붙여서 사용하는 것입니다.

array

array() 함수를 이용하여 리스트로 부터 넘파이 배열을 생성할 수 있습니다.

a = [0,1,2,3]
a = np.array(a)

위와같이 리스트를 array로 만들어서 사용할 수 있습니다.

type: 자료형 (여기서는 넘파이 배열, numpy.ndarray)
dtype: 요소의 자료형 (모든 요소의 자료형은 같습니다)
ndim: 배열의 차원
shape: 배열의 형상
size: 요소의 수
itemsize: 요소의 크기(byte 단위)
nbytes: 배열 전체의 크기(byte 단위)

위와같은 것들을 함수들을 사용하여 출력해낼 수있습니다.

shape

2,3 차원 배열을 만들어 .shape를 사용하면 높이, 열, 행 을 하여 데이터를 시각화 할 수 있습니다.

arange()

arange함수는 range와 사용방법이 비슷합니다. 괄호안에 start, stop, step 순서대로 적어서 array를 만들 수 있습니다.

a = np.arange(1,100,10)

이렇게 하면 1차원 array를 만들어낼 수 있습니다.

a = np.arange(24 , dtype = float)

위와같이 dtype를 float로 설정해주면 고정소수로 이루어진 배열을 만들 수 있습니다.

reshape

reshape는 위와같은 array의 현상을 변경할 수 있습니다.

a.arange(x).reshape() #(너비, 높이, 열, 행)(높이,열,행) or(열,행) 새로운 차원이 생기면 원래 있던 것들이 뒤로밀리고 insert(0)느낌으로 추가가 됩니다.

한개의 차원을 음수로 정하면 알아서 정해주는 기능이 있습니다.
ex)

a.arange(24).reshape(-1,3,4)

와 같이 정해주면 -1이 2로 자동으로 할당이 됩니다.

zeros(), ones(), full(), eye(), identity(), diag()

zeros()는 괄호안에 있는 갯수대로 0이 들어가있는 배열이 만들어집니다.
이때 첫번째 인자로 배열의 현상을 입력하면 그대로 반환해줍니다.
이때 defalt값으로는 float형으로 요소가 채워져서 두번째 인자에 int를 넘겨주면
int값으로 요소를 채워줍니다.

ones()는 1만 들어가있는 배열이 만들어지고
위와같이 첫번째 인자로 배열의 현상을 입력하면 그대로 1이 채워진 배열을 반환합니다.

full은 2번째로 들어가는 인자의 수로 채워진 배열이 만들어지고

eye()는 괄호안에 있는 숫자가 y라고하면 yxy의 크기의 정방단위행렬이 생성이 됩니다.
또 (z,y) 라고 넣어주면 zxy의 단위행렬이 만들어집니다.

identity()는 정방단위행렬을 만들고

diag는 안에 인자로 넘겨준 리스트를 대각선에 채워주는 함수입니다.
np.diag(a)와 같이 a배열을 넘겨주면 대각선의 값을 가져와서 반환해줍니다.

like

np.zeros_like(a) 주어진 행렬과 같은 형상(shape)을 가지며 0으로 채워진 배열을 만듭니다

np.ones_like(a) 주어진 행렬과 같은 형상(shape)을 가지며 1으로 채워진 배열을 만듭니다

np.full_like(a,3) 주어진 행렬과 같은 형상(shape)을 가지며 주어진 값(3)으로 채워진 배열을 만듭니다

random

np.random.randint(1,101,5) 1에서 100까지의 수중 5개를 뽑아 1차원배열을 만들어줍니다.
이 뒤에 .reshape()를 해주면 현상을 변경할 수 있습니다.

numpy 배열연산

a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([[5,6,7,8],[5,6,7,8]])

print(a+b)==print(np.add(a,b))
print()
print(a-b)==print(np.subtract(a,b))
print()
print(a*b)==print(np.multiply(a,b))
print()
print(a/b)==print(np.divide(a,b))
print()
print(a**b)==print(np.power(a,b))

이 연산들은 a[0][0]은b[0][0]과 더하고 a[1][1]은b[1][1]끼리 더하는 식으로 행렬의 덧셈과는 다르게 계산을 합니다.
원래의 행렬의 덧셈은 a@b , np.matmul(a,b)와 같은 형식으러 계산을 해줄 수 있습니다.

브로드캐스팅

a = np.array([1,2,3,4])
a+1 #[1,2,3,4]+[1,1,1,1]

a를 위와같이 해주고 거게에 +1을 해주면 1이라고 하면 1을 확장해주는 기능이 있습니다.

배열의 결합: concatenate()

concatenate는 axis(축)을 정해주어 concat(붙여주는) 기능입니다.

a1 = np.array([[1,2],[3,4]])
a2 = np.array([[5,6] ,[7,8]])
np.concatenate( (a1,a2),axis = 1)

결과는 array([[1, 2, 5, 6],
[3, 4, 7, 8]])
와같이 나옵니다. axis 0은 1차원끼리 연결할 때는(행)이 축이되고
2차원연결을 할 때는 열이 axis 0이되고 행은 axis 1이되는 로직으로 형성돼있습니다.
//귀납적 증명

배열의 결합 vstack(), hstack(), dstack(), stack()

vertical stack, horizontal stack, deapth stack, stack을 줄인말로 vstack은 수직의 방향으로 배열을 합치는 것이고 hstack은 수평의 방향으로 배열을 합치는 것이고, dstack은 높이방향으로 합치는 것이고 stack은 stack을 쌓는 느낌으로 합칩니다.

배열의 분리 hsplit, vsplit

vertical split, horizontal split 을 하는 것이고 수평으로 n등분 수직으로 n등분을 하는 것 입니다.

print(np.vsplit(a,n))
print(np.hsplit(a,n))

형태변환

a= np.arange(20).reshape(4,5)
print(a)
a.transpose() == a.T #행과열을 바꾼다.
print(a)
a = a.flatten()
print(a)

출력:
[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]

[[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]]

[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

위와같이 출력이 되며 transpose()는 행과열을 바꾸고 flatten()은 1행으로 바꿉니다.

배열비교

a1 = np.array([1,2,3,4])
a2 = np.array([2,2,4,1])
print(a1==a2)
print(a1>a2)

출력:
[False True False False][False False False True]

기본비교연산을 사용하면 각행,열별로 비교를 합니다.

a1 = np.array([1,2,3,4])
a2 = np.array([1,2,3,4])
np.array_equal(a1,a2)

출력:
True

np.array_equal()을 사용하면 통채로 비교를 합니다.

배열 정렬

np.sort(a)를 사용하여 정렬을 합니다.

a = np.array([1,4,2,5,3,7])
np.sort(a)

출력:
array([1, 2, 3, 4, 5, 7])

역으로 출력하려면 슬라이싱을 이용하여 할 수 있습니다.

a = np.array([1,4,2,5,3,7])
np.sort(a)[::-1]

출력:
array([7, 5, 4, 3, 2, 1])

ndindex

배열 모양에 맞게 np.ndindex 안에 그 현상을 넣으면 index를 처음부터 끝까지 출력할 수 있도록 해줍니다.

a = np.arange(24).reshape(4,3,2)
for index in np.ndindex(4,3,2):
    print(index, "\t", a[index])

(0, 0, 0) 0
(0, 0, 1) 1
(0, 1, 0) 2
(0, 1, 1) 3
(0, 2, 0) 4
(0, 2, 1) 5
(1, 0, 0) 6
(1, 0, 1) 7
(1, 1, 0) 8
(1, 1, 1) 9
(1, 2, 0) 10
(1, 2, 1) 11
(2, 0, 0) 12
(2, 0, 1) 13
(2, 1, 0) 14
(2, 1, 1) 15
(2, 2, 0) 16
(2, 2, 1) 17
(3, 0, 0) 18
(3, 0, 1) 19
(3, 1, 0) 20
(3, 1, 1) 21
(3, 2, 0) 22
(3, 2, 1) 23

수학,통계 함수

array를 만들고나서 a에 주소할당을 해주고
a.max(axis)를 해주면 최댓값을 구해주게되고
np.argmax(a,axis)를 해주면 maximum의 주소를 출력해줍니다.
a.std()를 하면 표준편차를 출력해주고
a.var()를 하면 분산을 출력합니다.
a.mean()을 하면 평균값을 출력합니다.

task

과제1. 넘파이의 차원에 대해서 정확히 알기(axis=0은 도대체 어디냐?)
result: 새로만든 차원의 깊이를 axis = 0 입니다.

과제2. 3차원 배열을 선언하고, 축을 기준으로 조작하는 예제 1개 이상 찾아서 작성(예, stack, split, concatenate 등)
result:
0부터23까지의 3차원 배열을(높이:2, 열:4, 행:3)으로 생성을 하고
[[[ 0 1 2][ 3 4 5]]

[[12 13 14][15 16 17]]]

[[[ 6 7 8][ 9 10 11]]

[[18 19 20][21 22 23]]]
위와같은 모양으로 출력을 하시오.
solution: print(*np.hsplit(a,2))

profile
KNU COMPUTER ENGINEERING

0개의 댓글