no image
[Numpy] 차원 축소 및 확장 (np.expand_dims 와 np.sqeeze)
두 함수는 주로 딥러닝에서 다차원 배열을 다룰 때 사용되, 텐서의 차원을 축소하거나 확대할 때 자주 사용합니다. np.expnad_dims import numpy as np np.expand_dims(data, axis) data : 차원을 추가할 array 또는 tensor입니다. axis : 확장할 축(차원)의 위치. 값은 정수, 리스트 또는 튜플의 형태로 입력할 수 있습니다. 예시1) axis에 정수를 넣어 2차원 배열을 3차원 배열로 확장하는 경우입니다. >>> import numpy as np >>> data = np.arange(12).reshape(3,4) >>> data array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> data1 = ..
2023.12.28
no image
[Numpy] 배열 이어붙이기 (concatenate, vstack, hstack, r_, c_)
np.concatnate numpy.concatenate((a1, a2, ...), axis=0)를 써서 사용합니다. 여기서 axis=0 행이고 axis=1 열입니다. axis=0이면 열에다가 concat axis=1이면 행에다가 concat axis에 대해 매개변수가 없으면 1차원으로 concat합니다. 그림으로 예시를 보여드리겠습니다. 각각 (2,3)의 a와 b의 배열이 있습니다. 두개의 배열에 대해 사용하는 예시를 보여드리겠습니다. 배열 선언 >>> import numpy as np >>> a = np.array([[1,2,3],[4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> b = np.array([[7,8,9],[10,11,12]]) >>> b array..
2023.12.26
no image
[Numpy] 팬시 색인(fancy indexing)
팬시 색인( fancy indexing)이란? 정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어이다. 팬시 색인은 슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사한다. 값을 가져오는 것이 아닌 값을 복사하는 것이다. 팬시 색인 예시 특정한 순서로 행을 선택하고 싶다면 원하는 순서가 명시된 정수가 담긴 ndarray 또는 list를 매개변수로 입력한다. 1차원 배열로 팬시색인을 하는 경우 >>> import numpy as np >>> arr = np.zeros((8,4)) >>> for i in range(8): ... arr[i] = i >>> arr array([[0., 0., 0., 0.], [1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3.,..
2023.12.22
no image
[Numpy] Numpy 메서드 ( argmin, argmax, cumsum, cumprod)
파이썬의 통계를 위한 메서드 배열 전체 혹은 배열의 한 축에 속하는 자료에서 통계를 계산하는 수학 함수 중 4개를 소개한다. argmax : 최대 원소의 인덱스값 argmin : 최소 원소의 인덱스값 cumsum : 0부터 시작하는 각 원소의 누적 합 cumprod : 1부터 시작하는 각 원소의 누적 곱 4개의 함수는 모두 axis라는 매개변수를 갖는다. (2차원 기준으로 설명) axis = 0 : 행을 의미하며, 계산은 행의 방향대로 진행 aixs = 1 : 열을 의미하며, 계산은 열의 방향대로 진행 np.argmin np.argmax(data, axis(default=0)) : 최대 원소의 인덱스 값 반환 >>> import numpy as np >>> data = np.array([[0,3,5],[..
2023.12.21
no image
[Numpy] Numpy란? (ndarray, ndim, shape)
Numpy란? Numerical Python의 준말인 넘파이$^{Numpy}$는 파이썬에서 산술 연산, 수치해석과 같은 수학 및 과학 연산을 위한 파이썬 패키지이다. 다차원 배열을 쉽고 효율적으로 처리하며 Pandas와 연동하여 자주 사용한다. 핵심 기능은 ndarray라고 하는 N차원의 객체 배열이다. 왜 사용하는가? 파이썬의 기본 라이브러리보다 매우 매우 빠르고 효율적이다, 배열 내부의 원소의 값들을 브로드캐스팅할 때, 파이썬은 반복문을 사용하지만, 넘파이는 한 번에 가능하기에 빠르다. Numpy 설치 $ pip install numpy ndarray, 다차원 배열 객체 생성 가장 기본적으로 생성하는 방법 >>> import numpy as np >>> data =np.array([[1.5, -0.1..
2023.12.20
728x90

두 함수는 주로 딥러닝에서 다차원 배열을 다룰 때 사용되, 텐서의 차원을 축소하거나 확대할 때 자주 사용합니다.

 

np.expnad_dims


import numpy as np
np.expand_dims(data, axis)

 

data : 차원을 추가할 array 또는 tensor입니다.

axis : 확장할 축(차원)의 위치. 값은 정수, 리스트 또는 튜플의 형태로 입력할 수 있습니다.

예시1) axis에 정수를 넣어 2차원 배열을 3차원 배열로 확장하는 경우입니다.

>>> import numpy as np
>>> data = np.arange(12).reshape(3,4)
>>> data
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
       
>>> data1 = np.expand_dims(data, axis=1)
>>> data1.shape
(3, 1, 4)

 

예시2) axis에 리스트를 넣어 2차원 배열을 4차원 배열로 확장하는 경우입니다.

>>> data2 = np.expand_dims(data, axis = [0,2])
>>> data2.shape
(1, 3, 1, 4)

 

np.squeeze


import numpy as np
np.squeeze(data, axis=None)

data : 차원을 축소할 array 또는 tensor입니다.

axis : 축소할 축(차원)의 위치. 값을 정수를 넣어서 특정 차원을 축소하거나 생략하여 차원의 크기가 1인 모든 차원이 제거됩니다.

 

예시1) axis에 정수를 넣은 경우

>>> data = np.arange(9).reshape(1,3,1,3)
>>> data.shape
(1, 3, 1, 3)

>>> data1 = np.squeeze(data, axis=0)
>>> data1.shape
(3, 1, 3)

 

예시2) axis값을 None으로 한 경우

>>> data.shape
(1, 3, 1, 3)


>>> data2 = np.squeeze(data)
>>> data2.shape
(3, 3)

 

728x90

np.concatnate


numpy.concatenate((a1, a2, ...), axis=0)를 써서 사용합니다. 여기서 axis=0 행이고 axis=1 열입니다.

  • axis=0이면 열에다가 concat
  • axis=1이면 행에다가 concat
  • axis에 대해 매개변수가 없으면 1차원으로 concat합니다.

 

그림으로 예시를 보여드리겠습니다.  각각 (2,3)의 a와 b의 배열이 있습니다. 두개의 배열에 대해 사용하는 예시를 보여드리겠습니다.

배열 선언

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b = np.array([[7,8,9],[10,11,12]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

 

 

np.concatenate((a, b), axis = None)


None을 입력하면 a와 b의 배열이 1차원으로 펼쳐진다고 생각하면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

>>> np.concatenate((a,b),axis=None)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

 

 

np.concatenate((a, b), axis = 0) , np.concatenate((a, b)), np.vstack((a, b))


세 개의 함수는 동일한 결과를 출력합니다. axis=0일 때, 행을 기준으로 concat, stack하게 됩니다. 자세한 것은 밑의 그림에 나와있습니다.

axis = 0 을 기준으로 a와 b의 배열이 합쳐지는 것을 볼 수 있습니다. vstack에서 v는 vertically를 의미하며 수직으로 쌓인다는 것을 말합니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.concatenate((a,b))
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> np.concatenate((a,b), axis=0)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
       # vstack도 동일한 결과 반환
>>> np.vstack((a,b))
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

 

 

np.concatenate((a, b), axis=1), np.hstack((a, b))


두 개의 함수는 동일한 결과를 출력합니다. axis=1일 때, 열을 기준으로 concat, stack하게 됩니다. 자세한 것은 밑의 그림에 나와있습니다.

axis = 1 을 기준으로 a와 b의 배열이 합쳐지는 것을 볼 수 있습니다.hstack에서 h는 horizontally를 의미하며 수평으로 쌓인다는 것을 말합니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.concatenate((a,b), axis=1)
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])
>>> np.hstack((a,b))
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])

 

 

추가적으로  r_와 c_에 대해서 설명해보겠습니다.

np.r_[a, b]


r_는 np.concatenate((a,b)),  np.vstack((a, b))와 동일하다고 보시면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

>>> np.r_[a,b]
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

 

np.c_[a, b]


c_는 np.concatenate((a,b), axis = 1),  np.hstack((a, b))와 동일하다고 보시면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.c_[a,b]
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])

 

출처 : https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html

 

728x90

 

팬시 색인( fancy indexing)이란?


정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어이다. 팬시 색인은 슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사한다. 값을 가져오는 것이 아닌 값을 복사하는 것이다.

 

팬시 색인 예시


특정한 순서로 행을 선택하고 싶다면 원하는 순서가 명시된 정수가 담긴 ndarray 또는 list를 매개변수로 입력한다.

 

1차원 배열로 팬시색인을 하는 경우

>>> import numpy as np
>>> arr = np.zeros((8,4))
>>> for i in range(8):
... arr[i] = i
>>> arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

>>> arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])

 

2차원 배열로 팬시색인을 하는 경우

각 색인 튜플에 대응하는 1차원 배열이 선택된다.

>>> arr = np.arange(32).reshape((8,4))
>>> arr
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]])
>>> arr[[1, 5, 7, 2],[0, 3, 1, 2]]
array([ 4, 23, 29, 10])

# (1,0), (5,3), (7,1), (2,2) 위치의 원소들이 선택됨

 

행렬의 행과 열에 대응하는 사각형 모양의 값으로 선택하는 방법

1. 해당하는 배열 추출

2. 추출된 배열 순서 변경

>>> arr
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]])
       
>>> arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

 

팬시 색인으로 값을 대입하는 경우, 색인된 값이 변경

>>> arr
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]])
>>> arr[[1,5,7,2],[0,3,1,2]] = 0

>>> arr
array([[ 0,  1,  2,  3],
       [ 0,  5,  6,  7],
       [ 8,  9,  0, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22,  0],
       [24, 25, 26, 27],
       [28,  0, 30, 31]])
728x90

파이썬의 통계를 위한 메서드

배열 전체 혹은 배열의 한 축에 속하는 자료에서 통계를 계산하는 수학 함수 중 4개를 소개한다.

  • argmax : 최대 원소의 인덱스값
  • argmin : 최소 원소의 인덱스값
  • cumsum : 0부터 시작하는 각 원소의 누적 합
  • cumprod : 1부터 시작하는 각 원소의 누적 곱

4개의 함수는 모두 axis라는 매개변수를 갖는다. (2차원 기준으로 설명)

  • axis = 0 : 행을 의미하며, 계산은 행의 방향대로 진행
  • aixs = 1 : 열을 의미하며, 계산은 열의 방향대로 진행

 

np.argmin


np.argmax(data, axis(default=0)) : 최대 원소의 인덱스 값 반환

>>> import numpy as np
>>> data = np.array([[0,3,5],[6,4,2]])
>>> np.argmax(data,axis=0)
array([1, 1, 0])

>>> np.argmax(data,axis=1)
array([2, 0])

 

 

np.argmin


np.argmin(data, axis(default=0)) : 최소 원소의 인덱스 값 반환

>>> import numpy as np
>>> data = np.array([[3,2,4], [1,3,2]])
>>> np.argmin(data, axis=0)
array([1, 0, 1])
>>> np.argmin(data, axis=1)
array([1, 0])

 

 

np.cumsum


np.cumsum(data, axis(default=0))0부터 시작하는 각 원소의 누적 합

>>> import numpy as np
>>> data = np.arange(1,13).reshape(4,3)
>>> data
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.cumsum(data, axis=0)
array([[ 1,  2,  3],
       [ 5,  7,  9],
       [12, 15, 18],
       [22, 26, 30]])
       
>>> np.cumsum(data, axis=1)
array([[ 1,  3,  6],
       [ 4,  9, 15],
       [ 7, 15, 24],
       [10, 21, 33]])

 

np.cumprod


np.cumprod(data, axis(default=0))1부터 시작하는 각 원소의 누적 곱

>>> import numpy as np
>>> data = np.arange(1,13).reshape(4,3)
>>> data
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

>>> np.cumprod(data, axis=0)
array([[   1,    2,    3],
       [   4,   10,   18],
       [  28,   80,  162],
       [ 280,  880, 1944]])
       
>>> np.cumprod(data, axis=1)
array([[   1,    2,    6],
       [   4,   20,  120],
       [   7,   56,  504],
       [  10,  110, 1320]])

 

728x90

Numpy란?


Numerical Python의 준말인 넘파이$^{Numpy}$는 파이썬에서 산술 연산, 수치해석과 같은 수학 및 과학 연산을 위한 파이썬 패키지이다. 다차원 배열을 쉽고 효율적으로 처리하며 Pandas와 연동하여 자주 사용한다. 핵심 기능은 ndarray라고 하는 N차원의 객체 배열이다. 

왜 사용하는가?

파이썬의 기본 라이브러리보다 매우 매우 빠르고 효율적이다

배열 내부의 원소의 값들을 브로드캐스팅할 때, 파이썬은 반복문을 사용하지만, 넘파이는 한 번에 가능하기에 빠르다.

 

Numpy 설치


$ pip install numpy

 

ndarray,  다차원 배열 객체 생성


가장 기본적으로 생성하는 방법

>>> import numpy as np
>>> data =np.array([[1.5, -0.1, 3], [0, -3, 6.5]])
>>> data
array([[ 1.5, -0.1,  3. ],
       [ 0. , -3. ,  6.5]])
       
>>> tmp = [1,2,3,4]
>>> data = np.array(tmp)
>>> data
array([1, 2, 3, 4])

 

 

np.array( 리스트, 튜플, 배열 또는 순차형 데이터)

위의 예시와 동일합니다.

 

np.arange(범위)

arrange는 파이썬의 range 함수의 배열 버전

>>> np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

 

np.ones(배열의 크기)

배열의 원소가 1로 이루어진 배열의 크기를 반환

>>> np.ones((2,4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]])

 

np.zeros(배열의 크기)

배열의 원소가 1으로 이루어진 배열의 크기를 반환

>>> np.zeros((5,3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

 

np.full(배열의 크기, Value)

배열의 원소가 Value로 이루어진 배열의 크기를 반환

>>> np.full((2,2), 44)
array([[44, 44],
       [44, 44]])

 

np.eye(N)

N x N 배열로 이루어졌으며 대각선 원소의 값이 1인 배열을 반환

>>> np.eye(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.]])

 

ndarray 차원과 모양


ndim과 shape

배열의 차원의 수와 모양을 확인하는 속성

>>> data = np.zeros((3,2,4))
>>> data.shape
(3, 2, 4)
>>> data.ndim
3