21.07.21_numpy 기초

우니·2021년 7월 21일

넘파이

목록 보기
1/3

까미님이 보고계셔

넘파이 기초입니다!

오늘은 파이썬 라이브러리 중 하나이고
많은 알고리즘의 기반이 되는 Numpy에 대해 살펴봅시다.

전반적으로 선형대수학(행렬)계산을 편하게 할 수 있고, 머신러닝의 모델을 만드는 도구 중 하나 라고 할 수 있습니다.



NumPy 기능

  1. 파이썬의 라이브러리 중 하나 선형대수(행렬) 기반의 프로그램을 쉽게 만들 수 있는 대표적인 패키지 입니다.
  2. 효율성이 좋다! 파이썬 list객체를 개선한 Numpydml ndarray 객체를 사용하면 더 많은 데이터를 더 빨리 처리 할 수 있습니다.
  3. Numpy의 기본 데이터 타입 : ndarry.ndarry
  4. ndrray.ndarry를 이용해서 넘파이에서 다차원 배열을 쉽게 연산 수행 할 수 있습니다.


Numpy 특징

1.강력한 N차원 배열 객체
2.정교한 브로드캐스팅(*넘파이가 연산 중에 다른 shape을 처리하는 방법) 가능
3.C/C++ 및 포트란 코드 통합도구
4.선형대수학. 푸리에 변환 및 난수기능
5.범용적 데이터 처리에 사용 가능한 다차원 컨테이너



randn

표준 정규분포에서 숫자를 2행 3열 출력하라는 의미입니다.
숫자가 많을 수록 평균을 의미하는 0에 가까워집니다.

예제로 살펴보겠습니다.

data = np.random.randn(2,3)
print(data,'\n') 
print(data*10, '\n')
print(data + data, '\n')


#결과 
[[-1.25622807  1.61798487 -0.79511149]
 [-0.42460763 -0.77881621 -1.50506333]] 

[[-12.56228075  16.17984865  -7.95111489]
 [ -4.24607631  -7.78816206 -15.05063325]] 

[[-2.51245615  3.23596973 -1.59022298]
 [-0.84921526 -1.55763241 -3.01012665]] 


다음은 2차원 array(=배열)를 만드는 연습을 해보겠습니다.

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

#결과 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
       
       
#1-9까지 값으로 2,4열짜리 array(=배열)을 다른 방식으로 만들어 보겠습니다. 

arr2 = np.arange(1,9).reshape(2,4)
arr2

#결과 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

다음은 3차원 array인
arr3을 만들고 몇행 몇열인지, 몇차원인지 알아보겠습니다.


#3차원 배열 만들기 
#3차원은 대괄호가 3개 붙습니다
arr3 = np.array([[[1,2,3,4,5],[6,7,8,9,10]],
[[1,2,3,4,5],[6,7,8,9,10]],
[[1,2,3,4,5],[6,7,8,9,10]]])

#shape로 몇 행, 몇 열 인지 확인
print(arr3.shape)

#ndim으로 차원 확인 
print(arr3.ndim) 


만들어진 배열을 몇차원인지 확인하려면
ndim이라는 명령어를 사용합니다.

print(arr.ndim)


넘파이 인덱싱

안타깝게도 넘파이에서는 iloc[], loc[]가 적용되지 않습니다 ㅠ.ㅠ

인덱싱을 사용해서 배열에 있는 값을 구해야 하는데요.
예를 들어 보겠습니다.


#배열 만들기 
ar2 = np.arange(1,10).reshape(3,3)

#결과 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
       
#1행 2열에 있는 2를 불러오겠습니다       
ar2 = [2] 

#1번째 행에서 2번 이전 인덱스까지만 잘라서 보여주세요
ar2 = [0][2] 

개인적으로는 인덱싱 방법이 많이 헷갈렸습니다.
그래서 아래와 같이 정리 했습니다.



인덱싱 하는 방법


# 1차원 
array[1] :1에 해당하는 인덱스를 추출 
(0부터 시작함을 잊지 말자!)

array[:] : array의 모든 성분을 추출 

array[1:2] :1에서 값2이전까지의 인덱스 값을 추출. 
예를 들어 [5:8]라면 [5:7]까지의 값이 나오게 됩니다. 

array[a:b] =3 
: 새로운 값3을 a부터 b의 위치에 넣는다 

#2차원 
array[:] : 콜론으로 구분한다 
array[2,:] : 2번 인덱스의 모든 값 추출 
array[1:3,] : 2행과 3행의 값을 출력 
array[:,3] : 열의 인덱스가 4열인 값을 출력 
array[:,:2] : 열의 인덱스가 2 미만인 값(1,2)을 추철 
array[3,2] : 행의 인덱스가 3, 열의 인덱스가2인 값을 추철 
array[:2,1:3]=0 2행 이전의 값에 1-2번째 컬럼에 0을 넣기 


zeros로 0으로 된 배열 만들기

값이 0으로만 구성된 3행, 6열짜리
1,2,3차원 배열을 zeros로 만들어 보겠습니다.


#1차원
print(np.zeros(10))

#결과
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

#2차원 
print(np.zeros(3,6))

#결과 
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]
 
 #3차원 
 print(np.zeros(3,2,3)

#결과 
[[[0. 0. 0.]
  [0. 0. 0.]
  [0. 0. 0.]]

 [[0. 0. 0.]
  [0. 0. 0.]
  [0. 0. 0.]]]



ones로 값에 1만 채우기

np.onese를 쓰면
행렬의 모든 값을 1로 채울 수 있습니다

print(np.ones(10))
print()

#결과 
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

print(np.ones((3,6)))
print()

#결과 
[[1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1.]]


print(np.ones((2,3,2)))
print()

#결과
[[[1. 1.]
  [1. 1.]
  [1. 1.]]

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

np.arange(15)를 통해
0부터 14까지의 숫자로 1차원 배열을 만들 수 있습니다.

reshape는 행과 열을 직접 지정핼 수 있는데요.
nap.arange(20)reshape(4,5)이런 방식으로 사용합니다.

reshape에 행 자리에 -1가 오면 행은 설정한 값에서 자동으로 채워라 라는 의미입니다. 마찬가지로 열 자리에 -1가 오면 열은 설정된 값에서 자동으로 채우라는 의미입니다.

그러면 5행 3열, 7행 25열의 다차원 배열을 만들어보겠습니다.

arr4 = np.arange(15).
print(arr4.reshape(5,3))

또는 
arr4.reshape(5,-1) 
도 사용할 수 있습니다. 

arr5 = np.arange(7*25)
print(arr5.rehsape(7,25))

또는 
print(arr.reshape(7,-1)
로도 사용할 수 있습니다.

다음으로는 1-24까지 3차원 배열을 만들고 1차원 차원 배열로 변환해 보겠습니다.


#1차원
print(arr.reshape(24) 

#결과 
[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

#2차원 
print(arr.reshape(4,6) 

#결과 
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]
 [13 14 15 16 17 18]
 [19 20 21 22 23 24]]


#3차원
arr = np.arange(1,25).reshape(2,2,6)
#결과 

넘파이에서 다차원 배열을 1차원으로 바꾸기

1.ravle()
2.reshape()
3.flatten()

import numpy as np 

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

#아래 3가지의 결과는 같습니다. 
a2 = a1.ravel() 
a2 = a1.reshape(-1)
a2 = a1.flatten()

#결과 
array([1,2,3,4])

하지만 원본값이 바뀌면 조금 달라지는데요.

ravel()과 reshape()는 변경된 값이 적용되는데,
flatten()만 변경된 값이 적용되지 않습니다.

예시를 들어 살펴봅시다.


a1[0][1] = 99

a2 = a1.reshape()
a2 = a1.ravel()
#결과 
array([[99,2],[3,4]]) 

a2 = a1.flatten()
#결과 
array([[1,2,3,4]])

배열을 리스트로 바꾸기

to.list()를 사용합니다

ar1 = np.arange(30).reshape(5,3,2)
ar1.tolist()


#결과 
[[[0, 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]]]

특정한 수로 모든 행렬 채우기

np.full을 사용합니다

#2행 2열 행렬을 7로 모두 채우세요

a = np.full((2,2),7)

#결과 
array([[7, 7],
       [7, 7]])

항등행렬

대각선에 위치한 값들이
1로 채워진 형태를 항등행렬이라고합니다.

항등행렬은 eye()로 만들 수 있습니다.

#3행짜리 항등 행렬을 만드세요 
ar = np.eye(3) 

이미 만들어진 배열과 같은 모양으로 0으로 채우기

#먼저 배열을 만듭니다.
a = np.array([[1,2,3],[4,5,6]])

#결과 
[[1 2 3]
 [4 5 6]]

#np.zeros_like를 사용합니다 
#np.zeros_like(a)를 사용하면 a형태와 같은 2행 3열짜리 배열에 0으로 가득 차게 됩니다. 
b = np.zeros_like(a)

#결과 
array([[0, 0, 0],
       [0, 0, 0]])

50개로 나누기

linspace를 사용하면 됩니다.

범위만 설정하면 0부터 10까지의 숫자를 균등한 크기로
50개로 나눌 수 있습니다.

np.linspace(0,10)

균등하게 나눠지는 숫자 직접 지정


#0-1사이를 5개의 간격으로 균등하게 나누세요
np.linspace(0,1,5, retstep=True) 

profile
데이터와 머신러닝을 배우는 일본사업 마케터입니다

0개의 댓글