본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Playdata_study/Python

210720_Numpy (array, random, 인덱싱, 슬라이싱)

by 케리's 2021. 7. 20.

 

AI : 머신러닝/딥러닝(더 deep하게 들어간다)
      NN -> FNN, ANN, DNN, CNN(여기서 부터 딥러닝이시작)
→ UGG, UNGT

 




1. 데이터분석


Numby / Pandas (Series, DataFrame - 데이터프레임 정수)
Matplot/seaborn : 시각화
Featuer Engineering
Data PreProcessing
Visualization

 

 


2. 머신러닝 


머신에서 기기가 학습한다. 
머신이 학습하기위해 머신에 데이터를 제공해야한다 (big data) 
bigdata는 Feature, 전처리가 되어있어야한다.

 


1) 학습의형태


지도학습 : 기업에서 추구
 Decision Tree, Random Forest, Boostring, Linear, Sum

 

비지도학습
 Clastrering, 추천 협업 시스템 (넷플릭스)

 


2) Tool
아나콘다 →  Jupyter Notebook →  Gpu server (colab) 

 

 

 

 

Numpy 배열 생성하기

 

 

- Numpy 는 Numeric Python의 줄임 말

- 수학분야 관련된 통계 연산 작업 시 필요한 라이브러리 과학 계산 컴퓨팅과 데이터 분석에 필요한 가장 기본적인 패키지

- Numpy 배열은 리스트와 거의 흡사하지만 연산 속도가 빠르고 메모리 효율성이 높아서 대용량 데이터를 다루는데 성능상 우위를 차지한다.

- 사용하기 전에 라이브러리 모듈을 import해야 한다.

 

 

 

 1) array( ) 사용

 2) random 랜덤 함수 사용

 

 

import numpy as np

 

 

 

np 배열 생성

 

1) array() 사용

 

리스트와 numpy 배열을 각각 생성해 두 개를 비교해보자

 

  1. 리스트는 출력결과가 [ ]안에 들어오고 각 요소들이 ,로 구분된다.
  2. np 배열은 출력결과가 [ ]안에 들어오고 각 요소들이 그냥 나열된다.
  3. np 배열의 타입은 ndarray 타입

- ndarray 클래스는 다차원 행렬구조를 지원하는 Numpy의 핵심 클래스

 

myList = [4,5,6,7]
myArr = np.array(myList)

print(myList)
print(myArr)

print(type(myList))
print(type(myArr))

============================================

[4, 5, 6, 7]
[4 5 6 7]
<class 'list'>
<class 'numpy.ndarray'>

 

 

 

슬라이싱과 인덱싱

 

 슬라이싱(자른다) 은 인덱싱 개념이 포함된다

 0,1,2,3 [4,5,6,7] 인데 1은포함되고 3번째는 포함되지 않는 의미

 (숫자일때는 뒷 부분 숫자가 포함되지 않는다)​

 

myList[1:3]

===================================================

[5, 6]

 

# 슬라이싱, 인덱싱

 

# 1) 슬라이싱​

list_sub = myList[1:3]
print(list_sub)​



arr_sub = myArr[1:3]
print(arr_sub)​


# 2) 인덱싱​

list_sub[0] # 이미 출력된값에서 인덱싱이라 5 출력된다.​

list_sub[0] = -5
arr_sub[0] = -5​

print(list_sub)
print(arr_sub)

================================================================

[5, 6]
[5 6]
[-5, 6]
[-5 6]

 

리스트와 np 배열의 차이점

 

리스트는 원본이 유지된다. 원본을 카피해서 새로운 걸 만든다.

np 배열은 원본 뷰가 바뀐다. 메모리 활용적인 성능면에서 np배열이 성능이 좋아진다.

 

 

print(myList)
print(myArr)

===========================================

[4, 5, 6, 7]
[ 4 -5 6 7]

 

 

2) random( ) 함수 사용

 

 

 random : 모듈, 클래스, 라이브러리라고 생각하면 된다

 

# ? docs 보는 방법

a = np.random.rand?
Docstring:
rand(d0, d1, ..., dn)

Random values in a given shape.

.. note::
    This is a convenience function for users porting code from Matlab,
    and wraps `random_sample`. That function takes a
    tuple to specify the size of the output, which is consistent with
    other NumPy functions like `numpy.zeros` and `numpy.ones`.

Create an array of the given shape and populate it with
random samples from a uniform distribution
over ``[0, 1)``.

Parameters
----------
d0, d1, ..., dn : int, optional
    The dimensions of the returned array, must be non-negative.
    If no argument is given a single Python float is returned.

Returns
-------
out : ndarray, shape ``(d0, d1, ..., dn)``
    Random values.

See Also
--------
random

Examples
--------
>>> np.random.rand(3,2)
array([[ 0.14022471,  0.96360618],  #random
       [ 0.37601032,  0.25528411],  #random
       [ 0.49313049,  0.94909878]]) #random
Type:      builtin_function_or_method

 

 

# 1차원 배열

 

# 1차원 배열 (vector) [ ]

a = np.random.rand(5)
print(a)
print(type(a))
==========================================

[0.16407081 0.44380046 0.93005769 0.5263614  0.37713094]
<class 'numpy.ndarray'>

 

# 2차원 배열

 

# 2차원 배열은 대괄호 [[]] 로 이루어있음​

np.random.rand(3,2)
# 값은 계속 변함 
=============================================

array([[0.02601484, 0.34969755],
       [0.8802785 , 0.72471427],
       [0.53718011, 0.84749854]])

 

 

b = np.random.randint(1,10,5)
print(b)
print(type(b))

=============================

[3 5 3 6 1]
<class 'numpy.ndarray'>

 

 

# randn (표준분포값)

 

# randn(10) 가우시안 표준분포값

c = np.random.randn(10)
print(c)
print(type(c))


=============================

[-0.71609573 -0.09804913 -0.63721058 0.19072024 -0.21393188 0.51351055 -1.36236077 
  1.97385793 2.25448916 -0.32849613] <class 'numpy.ndarray'>

 

 

np 배열 생성과 동시에 초기화

 

  • zeros(), ones(), arange() 함수 사용

 

# zeros

 

# 0으로 초기화
# 0값으로 이뤄진 크기가 10인 배열 생성​

az = np.zeros(10)print(az) # type float
===================================

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

 

# ones

 

# 1값으로 이뤄진 크기가 10인 배열 생성
ao = np.ones(10)
print(ao)

=============================

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

 

# 5라는 값으로 이뤄진 크기가 10인 배열 생성
af = np.zeros(10) + 5
print(af)

============================

[5. 5. 5. 5. 5. 5. 5. 5. 5. 5.]

 

 

 

 

# 2차원구조 : 매트릭스 matrix [[]]​

ae = np.eye(3)
print(ae)

==========================

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

 

 

# arange

 

# arange : 나란히 배열 

print(np.arange(3))
print(np.arange(0,3)) # 위랑 같음

print(np.arange(3,7))
print(np.arange(3,10,2)) # 2는 step

============================================

[0 1 2]
[0 1 2]

[3 4 5 6]
[3 5 7 9]

 

# full ()

 

# full () : 지정된 숫자로 배열을 채워라

afull = np.full((5,5), -11)
print(afull)



[[-11 -11 -11 -11 -11]
 [-11 -11 -11 -11 -11]
 [-11 -11 -11 -11 -11]
 [-11 -11 -11 -11 -11]
[-11 -11 -11 -11 -11]]

 

 

Numpy 배열 특징

 

 

리스트는 여러 가지 자료형 저장이 가능하다.
np 배열은 하나의 자료형만 저장할 수 있다.

 

 

만약에 숫자와 문자가 동시에 저장된다면,
capa (메모리용량이 더 큰 것)가 더 큰 문자로 변환되어서 저장되어진다.

 

 

np배열은 이러한 제약을 가지는 대신에 (동일한 데이터 타입으로만 저장 가능)
내부 원소에 대한 접근과 반복문 실행이 빨라지도록 설계되어져 있다.

 

값의 타입을 지정해서 저장할 때는 dtype 속성을 사용해서 저장한다.
  ex) int32, int64, float32, float64 ,,,,,

 

 

import numpy as np

myList = [1,2,3,'4',5,6]
print(myList)
print(type(myList))

# capa 가 큰 타입으로 통일 된다.

myArr = np.array([1,2,3,'4',5])
print(myArr)
print(type(myArr))


myArr2 = np.array([1,2,3,4.0,5])
print(myArr2)
print(type(myArr2))


# myArr3 = np.array([1,2,3,4], dtype = 'float')
myArr3 = np.array([1,2,3,4], dtype = np.float64)
print(myArr3)

==========================================================

[1, 2, 3, '4', 5, 6]
<class 'list'>
['1' '2' '3' '4' '5']
<class 'numpy.ndarray'>
[1. 2. 3. 4. 5.]
<class 'numpy.ndarray'>
[1. 2. 3. 4.]

 

 

 

Numpy 배열의 속성과 함수

 

  • ndim, shape, reshape, size, type, dtype
    numpy배열은 class = ndarray 클래스 (attribute, method)

 

  • Numpy 배열의 타입은 ndarray 클래스이다
    클래스는 다양한 field(attribute, 속성, 멤버변수)와 method (함수, Function, 기능)를 가지고있다
    ndim, shape, reshape, size, type, dtype은 필드로도 메소드로도 사용 가능하다.

 

 

#print(myArr)
myArr = np.array([1,2,3,4,5])

print(np.ndim(myArr)) # 몇 차원인지 리턴 
print(np.shape(myArr)) # 몇 행 몇 렬인지 알 수 있다.
print(np.size(myArr)) # 요소의 갯수
print(type(myArr)) # class type

=============================================================
1
(5,)
5
<class 'numpy.ndarray'>

 

 

print('*' * 30)
print(myArr.ndim) # 속성으로 바로 가져다 사용
print(myArr.shape)
print(myArr.size)
print(myArr.dtype) # class 안의 각 요소들의 type

============================================================

******************************
1
(5,)
5
int32

 

 

#astype()

 

# astype() : np배열의 원소 값을 한꺼번에 바꿀 수 있다. 
# astype(), type(), dtype 각각 구분해서 적용할 수 있어야 한다. 

myArr_1 = myArr.astype(np.float64)
print(myArr_1)

======================================================

[1. 2. 3. 4. 5.]

 

# reshape

 

# ★ reshape : shape(1차원)을 바꾼다 → 2차원으로 바꾼다.

arr1 = np.arange(32).reshape(8,4)
arr1

================================================

array([[ 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, 30, 31]])

 

 

랜덤함수와 seed값 설정하기

 

특정한 시작 숫자를 정해 주어서 난수를 발생 시키면 고정적인 난수가 발생됨
결과 확인시 시작 숫자가 동일하다면 테스트 확인시에 용이하다.

seed() 함수에 정수를 지정하면된다.

 

 

# 실행할때마다 값이 바뀐다
arr2 = np.random.randn(4,4)
arr2

===================================================

array([[-0.36995853, -0.15549965, -1.3293934 ,  0.34397922],
       [-1.00196992, -0.23597171,  0.62551739, -0.07679943],
       [-1.37508275,  1.69838087,  0.1453588 ,  0.42698379],
       [ 0.01229764, -1.78292138, -0.75282067,  0.40133832]])

 

# seed()

 

# 시드값은 0 혹은 양의 정수를 지정하면 된다.

np.random.seed(0)
arr3 = np.random.randn(4,4)
arr3

===============================================

array([[ 1.76405235,  0.40015721,  0.97873798,  2.2408932 ],
       [ 1.86755799, -0.97727788,  0.95008842, -0.15135721],
       [-0.10321885,  0.4105985 ,  0.14404357,  1.45427351],
       [ 0.76103773,  0.12167502,  0.44386323,  0.33367433]])

 

 

# reshape 할때는 지정하는 값을 정확하게 주어야 한다. 아니면 에러발생
# 시드값은 한번만 주면 계속 적용된다.

arr4 = np.random.randint(10,20,16).reshape(4,4) #16은 size
arr4

=======================================================

array([[12, 13, 18, 11],
       [13, 13, 13, 17],
       [10, 11, 19, 19],
       [10, 14, 17, 13]])

 

 

 

인덱싱과 조건 슬라이싱

  • 논리연산자를 통해 조건 슬라이싱을 걸 수 있다.

 

 

# 1. 논리연산자 사용
# 2. 0보다 작은 값들을 (음수) 전부다 0으로 바꿔보자

 

arr3

# 1. 논리연산자 사용

arr3[arr3 > 0]
arr3[arr3 < 0]

# 2. 0보다 작은 값들을 (음수) 전부다 0으로 바꿔보자

arr3[arr3 < 0] = 0
arr3

==================================================

array([1.76405235, 0.40015721, 0.97873798, 2.2408932 , 1.86755799,
       0.95008842, 0.4105985 , 0.14404357, 1.45427351, 0.76103773,
       0.12167502, 0.44386323, 0.33367433])
       
array([-0.97727788, -0.15135721, -0.10321885])


array([[1.76405235, 0.40015721, 0.97873798, 2.2408932 ],
       [1.86755799, 0.        , 0.95008842, 0.        ],
       [0.        , 0.4105985 , 0.14404357, 1.45427351],
       [0.76103773, 0.12167502, 0.44386323, 0.33367433]])

 

# 값을 바꾸면 원본도 함께 바뀐다.
arr3 

=============================================

array([[1.76405235, 0.40015721, 0.97873798, 2.2408932 ],
       [1.86755799, 0.        , 0.95008842, 0.        ],
       [0.        , 0.4105985 , 0.14404357, 1.45427351],
       [0.76103773, 0.12167502, 0.44386323, 0.33367433]])

 

 

# 3. where 함수를 적용 ... 조건부 슬라이싱

 

# 3. where 함수를 적용 ... 조건부 슬라이싱
arr3_1 = np.where(arr3 > 0, arr3, -1) 
arr3_1

# 삼항연산자
# (arr3가 0보다 크면 arr3 그대로 리턴하고, 아니면 -1로 바꿔라)

=====================================================================

array([[ 1.76405235,  0.40015721,  0.97873798,  2.2408932 ],
       [ 1.86755799, -1.        ,  0.95008842, -1.        ],
       [-1.        ,  0.4105985 ,  0.14404357,  1.45427351],
       [ 0.76103773,  0.12167502,  0.44386323,  0.33367433]])

 

 

## 중요!!!

arr5 = np.array([[1,2],[3,4],[5,6]])
print(arr5)

print(arr5 > 2)

print(arr5[arr5 > 2])

bool_idx = arr5>2
print(bool_idx)

print(arr5[bool_idx])

=====================================================

[[1 2]
 [3 4]
 [5 6]]
 
[[False False]
 [ True  True]
 [ True  True]]
 
[3 4 5 6]

[[False False]
 [ True  True]
 [ True  True]]
 
[3 4 5 6]

 

 

# 1) 2차원 arr4 에서 12,13,18,11 만 출력하자

 


* 알아두기 *
2차원 배열의 인덱스는 [ , ] → 행[]열[] = [행,열]
콤마를 기준으로 2개의 인자를 받음
앞 인자값은 행의 index, 뒤 인자는 열의 index
만약에 :을 넣으면 모든 요소에 해당된다.

 

arr4
======================================================
array([[12, 13, 18, 11],
       [13, 13, 13, 17],
       [10, 11, 19, 19],
       [10, 14, 17, 13]])

 

# 1) 2차원 arr4 에서 12,13,18,11 만 출력하자

print(arr4[0])

'''
* 알아두기 *
2차원 배열의 인덱스는 [ , ] → 행[]열[] = [행,열]
콤마를 기준으로 2개의 인자를 받음
앞 인자값은 행의 index, 뒤 인자는 열의 index
만약에 :을 넣으면 모든 요소에 해당된다.
'''
print(arr4[0][2])
print(arr4[0,2])

============================================================

[12 13 18 11]
18
18

 

 

# 2) 2번째라인 [13,13,13,17] 값을 가져오려면?

 

# 2) 2번째라인 [13,13,13,17] 값을 가져오려면?
print(arr4[1])
print(arr4[1,0:4])
print(arr4[1,0:])
print(arr4[1,:])

# 2차원으로 출력해보기
print(arr4[1:2, :])

======================================================

[13 13 13 17]
[13 13 13 17]
[13 13 13 17]
[13 13 13 17]
[[13 13 13 17]]

 

 

 

# 3) 전체 행에 대해서 4번째 열 (11,17,19,13) 가져오기

 

# 3) 전체 행에 대해서 4번째 열 (11,17,19,13) 가져오기

print(arr4[0:4,3:4])
print(arr4[:, 3:])
print(arr4[:,3])

============================================================

[[11]
 [17]
 [19]
 [13]]
[[11]
 [17]
 [19]
 [13]]
[11 17 19 13]

 

 

# 4) 전체 행에 대해서 1,2 열을 가지고 온다.

 

# 4) 전체 행에 대해서 1,2 열을 가지고 온다.
print(arr4[:,:2])

=====================================================

[[12 13]
 [13 13]
 [10 11]
 [10 14]]

 

 

Numpy통계함수

 

  • Pandas 에서 디테일하게 다루기 때문에 간단하게 정리만 함
  • sum, mean, std, min, max, argmax(최대 원소의 인덱스 값), argmin, cunsum (누적합)

 

import numpy as np

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

=======================================================

[[1 2]
 [3 4]]

 

 

# sum (axis = 0, axis = 1)

 : 행, 열의 원소 합산

 

# sum
print(np.sum(x))

# axis = 0 행기준, 각 열에 대한 합을 연산 
print(np.sum(x, axis=0)) 

# axis = 1 열기준, 각 행에 대한 합을 연산 
print(np.sum(x, axis=1)) 

===========================================================

10
[4 6]
[3 7]

 

# arr4 도 연산해보자.

 

arr4
======================================================
array([[12, 13, 18, 11],
       [13, 13, 13, 17],
       [10, 11, 19, 19],
       [10, 14, 17, 13]])

 

# cumsum 누적합

 

# cumsum 누적합 
print(np.cumsum(arr4, axis=0))

=============================================

[[12 13 18 11]
 [25 26 31 28]
 [35 37 50 47]
 [45 51 67 60]]

 

# argmax 

 

# argmax 
# 모든 행(열)들을 다 검색 그 중에서 각 행(열)에서 가장 큰 값을 가진 원소의 인덱스 리턴

print(np.argmax(arr4, axis=0))

=====================================================

[1 3 2 2]

 

'|Playdata_study > Python' 카테고리의 다른 글

210722_Pandas (DataFrame)  (0) 2021.07.23
210721_Pandas(Series, Matplot)  (0) 2021.07.23
210512_웹 크롤링2  (0) 2021.05.12
210511_웹 크롤링  (0) 2021.05.11
210510_Json 구현 및 웹 서비스  (0) 2021.05.10

댓글