[NumPy]내가 보려고 올린 NumPy 정리1

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!


NumPy

  • Numerical Python
  • 수학관련 패키지?라고 생각하면 될 것 같다.
  • http://www.numpy.org

  • C언어로 구현된 파이썬 라이브러리(외부 라이브러리)
  • 고성능 수치계산을 위해 만들어진 파이썬 패키지
  • 벡터, 매트릭스, n-th 배열(ndarray) 등의 데이터 분석을 위한 패키지
  • 벡터 및 행렬 연산에 있어서 매우 편리한 기능을 제공

  • array(배열) 단위로 데이터를 관리하며 이에 대한 연산을 수행
    • Numpy의 기본단위가 되는 array는 Dynamic type을 지원치 않고 한 타입만 지원한다.
    • 1차원의 Numpy array : Vector
    • 2차원 : Matrix
    • 3차원 이상 : Tensor
  • pandas와 matplotlib 기반

numpy 모듈 선언

import numpy as np
np.__version__
'1.19.2'

참고. 선언된 모듈과 패키지의 영향 범위
* 파이썬 콘솔이나 주피터 노트북의 코드 셀에서 import로 불러온 모듈이나 패키지는 한 번만 선언하면 다시 선언하지 않아도 된다.
* 주피터 노트북에서 새로운 노트북을 실행하면 다시 선언해 함


Array 정의 및 사용

* 시퀀스 데이터(리스트, 튜플 등)로 부터 배열 생성
* https://numpy.org/doc/stable/reference/arrays.html

array(object, dtype, …)

형식 : arr_obj = np.array(seq_data)

data1 = [1,2,3]
data1
[1, 2, 3]
data2 = [1,2,3,3.5,5]
data2
[1, 2, 3, 3.5, 5]
# 리스트 객체를 이용하여 array 생성
arr1 = np.array(data1)
arr1
array([1, 2, 3])

array 크기 확인 : shape

# array 크기 확인
arr1.shape
(3,)
# 리스트를 직접 입력하여 array 생성
arr2 = np.array([1,2,3,4,5])
arr2
array([1, 2, 3, 4, 5])
arr2.shape # 1차 데이터여서 5개의 데이터가 있다는 것을 알려 줌
(5,)

array 자료형 확인 : dtype

# array의 자료형 확인
arr2.dtype
dtype('int32')
arr3 = np.array([1, 2, 3, 3.5, 4])
arr3

array([1. , 2. , 3. , 3.5, 4. ])
arr3.dtype 
# arr3 배열의 원소 중 float 하나가 있기 때문에 모두 실수형으로 바뀐다.
dtype('float64')
arr3.shape
(5,)
arr4 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
arr4
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
arr4.shape
(4, 3)
arr4.dtype
dtype('int32')

numpy 자료형

* 부호가 있는 정수 int(8, 16, 32, 64)
* 부호가 없는 정수 uint(8, 16, 32, 64)
* 실수 float(16, 32, 64, 128)
* 복소수 complex(64, 128, 256)
* 불리언 bool
* 문자열 string_
* 파이썬 오브젝트 object
* 유니코드 unicode_

범위를 지정해 배열 생성(1) : np.arange() 함수

형식 : arr_obj = np.arange([start,] stop[, step])

np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(1, 5)
array([1, 2, 3, 4])
np.arange(1, 10, 2)
array([1, 3, 5, 7, 9])
np.arange(12).reshape(3, 4) # reshape(x,y) = x행 y열
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
b1 = np.arange(12).reshape(3,4)
b1.shape
(3, 4)

reshape(m,n)의 m*n의 개수와 arange()로 생성되는 원소의 개수와 일치해야 함
reshape()는 1차원 -> 2차원, 2차원 -> 1차원 등 차원을 바꿀 수 있다.

b2 = np.arange(7).reshape(3,3)
# b2가 7개의 데이터 값을 갖고 있는데 비해 
# reshape에서는 3행 3열. 즉, 9개의 데이터가 있어 
# 개수가 일치하지 않아서 에러가난다.
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-50-d5a4614a705b> in <module>
----> 1 b2 = np.arange(7).reshape(3,3)
      2 # b2가 7개의 데이터 값을 갖고 있는데 비해
      3 # reshape에서는 3행 3열. 즉, 9개의 데이터가 있어
      4 # 개수가 일치하지 않아서 에러가난다.


ValueError: cannot reshape array of size 7 into shape (3,3)

범위를 지정해 배열생성(2) : linspace() 함수

형식 : arr.obj = np.linspace(start, stop[, num=50])

50개로 나누는 것이 디폴트

np.linspace(1, 10, 10)
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
np.linspace(0, np.pi, 20) # np.pi= 원주율 파이
# 0과 파이 사이의 값을 20개로 나누어 출력
array([0.        , 0.16534698, 0.33069396, 0.49604095, 0.66138793,
       0.82673491, 0.99208189, 1.15742887, 1.32277585, 1.48812284,
       1.65346982, 1.8188168 , 1.98416378, 2.14951076, 2.31485774,
       2.48020473, 2.64555171, 2.81089869, 2.97624567, 3.14159265])
np.linspace(1, 10) # default 값인 50개로 나눈다.
array([ 1.        ,  1.18367347,  1.36734694,  1.55102041,  1.73469388,
        1.91836735,  2.10204082,  2.28571429,  2.46938776,  2.65306122,
        2.83673469,  3.02040816,  3.20408163,  3.3877551 ,  3.57142857,
        3.75510204,  3.93877551,  4.12244898,  4.30612245,  4.48979592,
        4.67346939,  4.85714286,  5.04081633,  5.2244898 ,  5.40816327,
        5.59183673,  5.7755102 ,  5.95918367,  6.14285714,  6.32653061,
        6.51020408,  6.69387755,  6.87755102,  7.06122449,  7.24489796,
        7.42857143,  7.6122449 ,  7.79591837,  7.97959184,  8.16326531,
        8.34693878,  8.53061224,  8.71428571,  8.89795918,  9.08163265,
        9.26530612,  9.44897959,  9.63265306,  9.81632653, 10.        ])

특별한 형태의 배열 생성

np.zeros(), np.ones(), np.eye() 함수

1) 모든 요소가 0인 배열 생성: np.zeros(shape, dtype=float, …)

np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros(10, dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.zeros((3, 5)) # 3행 5열, 튜플을 넣어줘야 이렇게 나온다!
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
np.zeros((3, 5)).reshape(5,3) # reshape을 사용해 행열도 바꿔봐~
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

2) 모든 요소가 1인 배열 생성 : np.ones(shape, dtype=None)

np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones(10, dtype=int)
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
np.ones((3,5), dtype=int)
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])

3) 대각요소가 1인 배열 생성1 : np.eye(n, m, k=K, dtype=자료형)

# 3행 3열에 대각요소만 1인 행렬이 만들어진다.
np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
np.eye(3,4, dtype=int) # 정방행렬이 아님, 자료값 정수형으로 변경
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0]])
np.eye(3,4, k = 1, dtype = int)
# k = 1, 인덱스를 1부터 시작하게 만듦.
array([[0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])
np.eye(3, 4, k = 2, dtype = int)
# 1이 2칸 옆으로 간 열부터 대각으로 뿌리기 시작
array([[0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 0]])
np.eye(3, 4, k = -1, dtype = int) # k에 -n 을 넣으면 왼쪽으로 n칸
array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0]])

4) 대각요소가 1인 배열 생성2 : np.identity(n, dtype=자료형)

# n*n 크기의 단위행렬 생성
np.identity(5, dtype=int) # 5 * 5 행열이 생김
array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])

5) 초기화되지 않은 배열 생성 : np.empty(shape, dtype=float)

# 초기화 되지 않은 배열 생성
np.empty(4)
array([2.47032823e-323, 6.95312088e-310, 2.02369289e-320, 2.47032823e-323])

배열의 데이터 타입 변환 : astype() 함수

[형식]

num_arr = str_arr.astype(dtype)
dtype : int, float, str

NumPy 데이터 형식 : dtype (책 p.222)

  • ‘i’ : 부호가 있는 정수 int(8, 16, 32, 64)
  • ‘u’ : 부호가 없는 정수 uint(8, 16, 32, 64)
  • ‘f’ : 실수 float(16, 32, 64, 128)
  • ‘c’ : 복소수 complex(64, 128, 256)
  • ‘b’ or ‘?’ : 불리언 bool
  • ‘U’ : 유니코드 문자열
  • ‘O’ : 오브젝트형

문자열 배열을 숫자형 배열로 변환

np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
array(['1.5', '0.62', '2', '3.14', '3.141592'], dtype='<U8')
str_a1 = np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
num_a1 = str_a1.astype(float) # 문자형은 숫자형으로 바꾸기
# num_a1 = str_a1.astype('float32')도 가능!
num_a1
array([1.5     , 0.62    , 2.      , 3.14    , 3.141592])
str_a1.dtype # 문자형
dtype('<U8')
num_a1.dtype # 숫자형
dtype('float64')
str_a2 = np.array(['1', '3', '5', '7', '9'])
num_a2 = str_a2.astype(int) # 정수형으로
num_a2
array([1, 3, 5, 7, 9])
num_a3 = str_a2.astype(float) # 실수형으로
num_a3
array([1., 3., 5., 7., 9.])
num_a4 = str_a1.astype(int) 
# .이들어간 문자형을 정수형으로 바꾸면 안된다.(실수형은 가능)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-95-bce26b76df27> in <module>
----> 1 num_a4 = str_a1.astype(int)
      2 # .이들어간 문자형을 정수형으로 바꾸면 안된다.(실수형은 가능)


ValueError: invalid literal for int() with base 10: '1.5'

실수형 배열을 정수혈 배열로 변환

num_f1 = np.array([10, 21, 0.549, 4.75, 5.98])
num_f1 # 정수형도 실수형으로 바뀜(.이 찍힘)
array([10.   , 21.   ,  0.549,  4.75 ,  5.98 ])
num_i1 = num_f1.astype(int)
num_i1  # 정수형으로 바뀜!
# 중요한 것은 모두 round down 된다는것이다.
array([10, 21,  0,  4,  5])
num_f1.dtype
dtype('float64')
num_i1.dtype
dtype('int32')

숫자형 배열을 문자열 배열로 변환

num_f1.astype('U') # 유니코드32로 변환
array(['10.0', '21.0', '0.549', '4.75', '5.98'], dtype='<U32')
num_f1.astype('S')
array([b'10.0', b'21.0', b'0.549', b'4.75', b'5.98'], dtype='|S32')

난수 배열 생성

random.rand(), random.randint() 함수

random.rand([d0, d1, …, dn])

  • [0과 1) 사이의 실수 난수를 갖는 NumPy 배열을 생성]
  • rand(d0, d1, …, dn)을 실행하면 (d0, d1, .., dn)의 형태를 보이는 실수 난수 배열 생성
np.random.rand(10)
np.random.rand(2,5)
array([[0.81075852, 0.96839103, 0.92734339, 0.7367261 , 0.16054829],
       [0.99387669, 0.06062578, 0.24653199, 0.65040437, 0.99729459]])
np.random.rand() # 한개만
0.19831774647832667
np.random.rand(2,3,4) # (면,행,렬)
array([[[0.18637109, 0.18076786, 0.87092099, 0.0014111 ],
        [0.06726972, 0.85321027, 0.56316736, 0.92553405],
        [0.70529795, 0.94861209, 0.49012668, 0.14774724]],

       [[0.46761248, 0.5183946 , 0.35053201, 0.55678582],
        [0.23383691, 0.62521424, 0.4682477 , 0.09237873],
        [0.96108493, 0.97033424, 0.40605525, 0.44390691]]])

random.randint([low,] high [,size])

  • [low, high) 사이의 정수 난수를 갖는 NumPy 배열을 생성
  • size : (d0, d1, …, dn) 형식으로 입력
np.random.randint(10) # 0에서 10사이의 문자 한개가 나옴
4
np.random.randint(10, 20) # 10에서 20사이의 문자 한개
19
np.random.randint(10, 20, size = (3,5)) # size는 차원수(2차원)
array([[12, 17, 18, 17, 14],
       [14, 11, 16, 17, 16],
       [12, 18, 11, 10, 15]])
np.random.randint(10, 20, size = (2,3,5)) # size는 차원수(3차원)
array([[[16, 14, 11, 17, 10],
        [11, 13, 16, 18, 14],
        [19, 13, 11, 16, 19]],

       [[19, 18, 16, 14, 16],
        [19, 15, 12, 18, 16],
        [17, 16, 13, 15, 13]]])

Array 연산

기본 연산(합, 차, 곱, 나눗셈 등)

: 기본적으로 동일한 크기의 array 간 연산 수행

arr1 = np.array([[1,3,4],[4,3,6]])
arr1
array([[1, 3, 4],
       [4, 3, 6]])
arr2 = np.arange(10, 16).reshape(2,3) # arange, reshape 이용
arr2
array([[10, 11, 12],
       [13, 14, 15]])
print(arr1.shape, arr2.shape)
(2, 3) (2, 3)

배열의 합

arr1 + arr2
array([[11, 14, 16],
       [17, 17, 21]])

배열의 차

arr1 - arr2
array([[-9, -8, -8],
       [-9, -11, -9]])

배열의 곱

arr1 * arr2 # 순수하게 위치가 같은 것 끼리 곱하는 것
array([[10, 33, 48],
       [52, 42, 90]])

배열의 나눗셈

arr1 / arr2
array([[0.1       , 0.27272727, 0.33333333],
   [0.30769231, 0.21428571, 0.4       ]])

배열의 스칼라 곱

arr1*2 # arr1의 값들이 2배 씩 늘어남
array([[ 2,  6,  8],
       [ 8, 6, 12]])

배열의 비교 연산

arr2 > 12  # arr2의 각 값들을 True or False 형태로 변환
array([[False, False, False],
       [ True,  True,  True]])

배열의 Broadcasting

  • 서로 크기가 다른 array들의 연산이 가능하도록 배열을 자동적으로 변환하여 연산 수행
arr1
array([[1, 3, 4],
       [4, 3, 6]])
arr3 = np.array([10,11,12])
arr3
array([10, 11, 12])
(arr1.shape, arr3.shape) # 형태는 다르지만
((2, 3), (3,))
arr1 + arr3 # 차원에 맞게끔 더해진다.
# arr1의 1행과 2행에 arr3의 요소가 각각 더해진다.
array([[11, 14, 16],
       [14, 14, 18]])
arr1 ** 2 # arr1의 제곱의 형태도 가능
array([[ 1,  9, 16],
       [16,  9, 36]], dtype=int32)

브로드캐스팅이 일어날 수 있는 조건

  • 두 배열간의 연산에서 최소한 하나의 배열의 차원이 1인 경우(0번 축이든 1번 축이든; 1행이든 1열이든)
  • 차원의 짝이 맞을 때(차원에 대해 축의 길이가 동일하면)

image

출처 : http://www.astroml.org/book_figures/appendix/fig_broadcast_visual.html


2022

[web]jQuery 복습 3

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

16 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

9 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑