반응형

NumPy 기초 3 - 행렬 데이터의 결합, concatenate 함수

  • concatenate 

먼저 결합에 필요한 배열을 만들겠습니다. 

2행 3열인 정수 랜덤 데이터 = na1

3행 2열인 정수 랜덤 데이터 = na2

3행 3열인 정수 랜덤 데이터 = na3


[코드예제]

na1 = np.random.randint(10, size=(2, 3))
na2 = np.random.randint(10, size=(3, 2))
na3 = np.random.randint(10, size=(3, 3))

각각의 데이터를 확인해보겠습니다. 

 

[코드예제]

na1

[결과] 

array([[3, 0, 0],
       [5, 7, 5]])

 

[코드예제]

na2

[결과] 

array([[0, 8],
       [6, 5],
       [1, 7]])

 

[코드예제]

na3

[결과] 

array([[4, 3, 6],
       [1, 4, 0],
       [8, 5, 4]])


1_ 세로로 결합하기

: concatenate는 기본 세로로(위 아래로) 결합 됩니다. 

: 작성법

np.concatenate((a행렬, b행렬))

 

[코드예제]

# 세로 결합
np.concatenate((na1, na3))

[결과] 

array([[3, 0, 0],
       [5, 7, 5],
       [4, 3, 6],
       [1, 4, 0],
       [8, 5, 4]])

 

2_ 가로로 결합하기 

: 기본 작성법에서 axis = 1로 변경하면 옆으로(가로로) r결합되는 것을 확인할 수 있습니다. 

 

[코드예제]

# 가로 결합
np.concatenate((na2, na3), axis=1)

 

[결과] 

array([[0, 8, 4, 3, 6],
       [6, 5, 1, 4, 0],
       [1, 7, 8, 5, 4]])

 

반응형
반응형

Index

1. linspace, logspace 함수

      1_ linspace

      2_ logspace

     

2. NumPy random

      1_ seed : 랜덤의 시작 값을 설정

      2_ rand : 균등분포로 난수를 발생

      3_ randn : 정규분포로 난수를 발생

      4_ randint : 균등분포로 정수값을 발생

      5_ suffle : 행렬 데이터를 섞어 줍니다.

      6_ choice : 특정 확률로 데이터를 선택


1. linspace, logspace 함수

linspace와 logspace 특정 곡선을 그리듯 일정 간격으로 구성된 벡터값을 생성하기 위한 함수입니다.

  • linspace : 설정한 범위에서 선형적으로 분할한 위치의 값을 출력합니다. 
  • logspace : 설정한 범위에서 로그로 분할한 위치의 값을 출력합니다. 

1_ linspace

a와 b사이에 c개의 점을 생성하기 위한 명령어입니다.

만약에 c가 생략될 경우 → linspace(a, b) 100개의 일정한 등간격을 가진 행 벡터가 생성됩니다.

  • 사용 방법 : np.linspace(a, b, c)

[코드예제]

np.linspace(0, 100, 5)

[결과] 

array([  0.,  25.,  50.,  75., 100.])

 

2_ log space

a, b, c 을 log scale 등간격인 행 벡터를 생성하는  명령어입니다.

아례 예제처럼 log^a와 log^b 사이에 등간격인 c개의 행벡터를 생성합니다

 

만약에 c가 생략될 경우 → logspace(a, b) 50개의 일정한 등간격을 가진 행 벡터가 생성됩니다.

  • 사용 방법 : np.logspace(a, b, c)

[코드예제]

# log10(x1)=2, log10(x2)=3, log10(x3)=4 만들기
np.logspace(2, 4, 3)

[결과] 

array([  100.,  1000., 10000.])

 

 

2. NumPy random

데이터를 생성할 때 랜덤하게 섞거나 임의의 수를 발생시키는 NumPy의 random 서브 패키지로 제공됩니다.

서브 패키지이기 때문에 앞에 항상 np.random.을 써주어야 합니다.  

 

1_ 시드값

  • seed : 랜덤의 시작 값을 설정

2_ 난수 생성

  • rand : 균등분포로 난수를 발생(0부터 1사이) 
  • randn : 정규분포로 난수를 발생 (가우시안의 표준 정규 분포)
  • randint : 균등분포로 정수값을 발생 (균일 분포의 정수 난수)

3_ 데이터 순서바꾸기

  • suffle : 행렬 데이터를 섞어 줍니다.

4_ 데이터 샘플링

  • choice : 특정 확률로 데이터를 선택


1_ 시드 값 생성 : seed 

: 처음 넘파이를 접하시는 분들은 seed 개념이 어려울 수 있는데 컴퓨터 프로그램에서 무작위 수는 "정말" 무작위가 아니라, 어떤 특정 시작 수를 정해주면 정해진 알고리즘에 따라 난수처럼 보이는 무작위 수열을 만들어줍니다.

이때 시작 수 "seed"라고 합니다.

특정한 시드값이 사용되면 다음에 만들어지는 난수들은 사실 모두 예측할 수는 있습니다. 

 

[코드예제]

# seed는 객체를 바꾸어주는 함수이기 때문에 1 동일한 숫자를 넣었을 경우
# randint로 출력되는 값이 같다는 걸 알 수 있다.

np.random.seed(1)
result1 = np.random.randint(10, 100, 10)

np.random.seed(1)
result2 = np.random.randint(10, 100, 10)

np.random.seed(2)
result3 = np.random.randint(10, 100, 10)

result1, result2, result3

[결과] 

(array([47, 22, 82, 19, 85, 15, 89, 74, 26, 11]),
 array([47, 22, 82, 19, 85, 15, 89, 74, 26, 11]),
 array([50, 25, 82, 32, 53, 92, 85, 17, 44, 59]))

 

2_ 난수 생성 rand, randn, randint

random의 서브 패키지 중에서 난수를 생성하는 3총사 입니다. 

  • rand : 균등분포로 난수를 발생(0부터 1사이) 
  • randn : 정규분포로 난수를 발생 (가우시안의 표준 정규 분포)
  • randint : 균등분포로 정수값을 발생 (균등 분포의 정수 난수)

균등분포와 정규 분포가 헤깔리시는 분들을 위해 아래 그림으로 설명합니다

  • rand

: 0에서 1사이 균일한 확률 분포로 실수와 난수를 만들어주는 서브 패키지 입니다. 

괄호 안에 들어가는 숫자(인수)는 난수의 크기(n개)로 보시면 됩니다.  

 

[코드예제]

np.random.rand(10)

 

array([0.20464863, 0.61927097, 0.29965467, 0.26682728, 0.62113383,
       0.52914209, 0.13457995, 0.51357812, 0.18443987, 0.78533515])

 

 

 

  • randn

: 표준편자가 1인 가우시안의 표준 정교 분포를 따른 난수 생성 패키지입니다. 

 

[코드예제]

np.random.randn(10)

 

array([-0.0191305 ,  1.17500122, -0.74787095,  0.00902525, -0.87810789,
       -0.15643417,  0.25657045, -0.98877905, -0.33882197, -0.23618403])

 

  • randint

: a에서 시작하여 b-1까지 난수를 발생시키며, 괄호 안은 행렬의 size를 말합니다. 

사용법은 

np.random.randint(a, b, (행, 열))

 

[코드예제]

r = np.random.randint(1, 10, (3, 4))
r

 

array([[2, 8, 9, 3],
       [9, 8, 2, 7],
       [9, 6, 4, 1]])

 


3_ 데이터 순서바꾸기

  • suffle : 행렬 데이터를 섞어 줍니다.

[코드예제]

np.random.shuffle(r)
r

[결과] 

array([[9, 6, 4, 1],
       [9, 8, 2, 7],
       [2, 8, 9, 3]])


4_ 데이터 샘플링 (data sampling)

  • choice : 특정 확률로 데이터를 선택합니다.  
  • 사용법
    : np.numpy.choice(a, size=None, replace=True, p=none) 
    - a : 배열이면 이미 있는 데이터로, 정수라면 arange(a) 함수 명령을 통해 데이터를 만듭니다. 
    - size : 샘플을 원하는 갯수
    - replace : boolean 으로 true일 경우 선택되었더라 하더라도 데이터를 다시 선택할 수 있습니다.
    - p : 각 데이터가 선택 될 수 있는 확률입니다 ( 주사위가 각 면이 나올 확률이 1/6인 것 처럼) 

[코드예제]

 

 

np.random.choice(5, 10, p=[0.1, 0, 0.4, 0.2, 0.3])

[결과] 

array([4, 3, 2, 4, 2, 4, 4, 3, 4, 4])

 

1. linspace, logspace 함수

      1_ linspace

      2_ logspace

     

2. NumPy random

      1_ seed : 랜덤의 시작 값을 설정

      2_ rand : 균등분포로 난수를 발생 

      3_ randn : 정규분포로 난수를 발생

      4_ randint : 균등분포로 정수값을 발생

      5_ suffle : 행렬 데이터를 섞어 줍니다.

      6_ choice : 특정 확률로 데이터를 선택

 

반응형
반응형

NumPy 기초  - numpy란, 행렬, 데이터선택, 브로드캐스팅(broad casting), 마스킹(masking)

1. NumPy 알아보기 

      1_ Numpy란? 

      2_ Numpy 사용하기(import) 

     

2. NumPy 배열

      1_ list 데이터로 행렬 데이터를 생성하기

      2_ 행렬의 모양 변경하기 

      3_ 행렬 데이터의 선택 : offset index

      4_ 데이터 수정하기 

      5_ 브로드캐스팅 (broad casting)  &  마스킹(masking)

      6_ 행렬 데이터의 생성 _ zeros / ones 


1.NumPy 알아보기 

1_ Numpy란?

Numpy(넘파이)는 행렬 연산에 있어서 다양한 편의를 제공하는 모듈입니다.

단위는 array로 데이터가 저장됩니다. 

 

특징은 

  • 내부가 속도가 빠른 C로 작성되어있어 연산 속도가 매우 빠릅니다
  • 특히 선형대수학을 빠르게 연산할 수 있습니다 

 

2_ Numpy 사용하기(import) 

import numpy as np

 

2. NumPy 배열

1_ list 데이터로 행렬 데이터를 생성하기 

 

np.array() 괄호안에 list 데이터를 넣어 배열을 형성할 수 있습니다. 

type()을 넣어 데이터 타입을 확인하면, numpy.ndarray 라는 형식으로 데이터 타입이 출력됩니다. 

 

[예제코드] 

arrary = np.array([1, 2, 3])
type(arrary), arrary

[결과]

(numpy.ndarray, array([1, 2, 3]))

 

list 를 두번 중첩하여 사용함으로 2차원 배열을 만들 수 있습니다. 

 

[예제코드] 

arrary2 = np.array(
    [[1, 2, 3],
    [4, 5, 6]],
)
arrary2, arrary2.ndim, arrary2.shape

[결과]

(array([[1, 2, 3],
        [4, 5, 6]]), 2, (2, 3))

 

 

2_ 행렬의 모양 변경하기 

reshape()를 통해 객체(행렬)의 모양을 변경할 수 있습니다.

실제로 데이터를 변경하는 것은 아니고, 배열 객체의 shape 정보만을 수정합니다.  

 

[예제코드] 

arrary2.reshape(3, 2)

[결과]

array([[1, 2],
       [3, 4],
       [5, 6]])

 

3_ 행렬 데이터의 선택 : offset index (오프셋 인덱스)

array 배열 역시 index를 가지고 있어 데이터를 선택할 때 마스킹을 사용합니다

2차원 array 인덱스는

  • [ , ] 콤마를 기준으로 2개의 인자를 입력한다. (앞은 행, 뒤는 열)
  • [ ] [ ]  대괄호를 두개 써서 2개의 인자를 별도로 입력할 수 있습니다.  (앞은 행, 뒤는 열)


  • [행, 열] 로 데이터 선택하기 

[예제코드] 

arrary2[1, 2] # arrary2[1][2]

[결과]

6

 

 

 

  • [행] [열] 로 데이터 선택하기 

[예제코드] 

arrary2[1][::-1] #두번째 행을 선택하고, 처음부터 끝까지 가져오되, 역순으로 가져오기

[결과]

array([6, 5, 4])

 

 

4_ 데이터 수정하기 

이제 데이터를 선택했으니 list 처럼 수정해보겠습니다. 

 

[예제코드] 

#2번째 행에서 3번째 데이터를 선택하여 10으로 바꾸어주기
arrary2[1][2] = 10  
arrary2

[결과]

array([[ 1,  2,  3],
       [ 4,  5, 10]])

 

 

5_ 브로드캐스팅 (broad casting)  &  마스킹(masking)

 하나의 배열or 요소가 어떤 특정 배열에 영향을 미칠때 배열간의 형상을 맞추는 것을 브로드 캐스팅이라고 합니다 

 

[예제코드] 

# 첫번째 행의 전부를 0으로 데이터 바꾸기 
arrary2[0] = 0
arrary2

[결과]

array([[ 0,  0,  0],
       [ 4,  5, 10]])

 

[예제코드] 

# 첫번째 행을 7, 8, 9로 데이터 바꾸기 
arrary2[0] = [7, 8, 9]
arrary2

[결과]

array([[ 7,  8,  9],
       [ 4,  5, 10]])

 

** 브로드캐스팅에서 비교연산자를 사용하면 연산이 된 후 true / false 로 리턴됩니다

이후 masking할때 자주 사용됩니다. 

[예제코드] 

# array2 배열에서 7이상의 요소들만 true 로 반환
#idx변수를 만들어 (= masking을 만듬) true/false로 변환된 데이터를 저장) 
idx = arrary2 > 7
idx

[결과]

array([[False,  True,  True],
       [False, False,  True]])

 

[예제코드] 

#offset index 값으로 key를 찾는 것 처럼
#만들어진 idx 마스킹을 사용하여 true에 해당하는 값들만 출력할 수 있습니다. 
arrary2[idx]

[결과]

array([ 8,  9, 10])

 

 

[예제코드] 

# true에 해당하는 값들을 100을 넣어 주어 요소를 바꿉니다

arrary2[idx] = 100
arrary2

[결과]

array([[  7, 100, 100],
       [  4,   5, 100]])

 

 

6_ 행렬 데이터의 생성 _ zeros / ones 

Numpy는 원하는 shape으로 배열을 설정하고, 각 요소를 특정 값으로 초기화하는

zeros, ones 와 같은 다양한 함수를 제공합니다.

또한, 파라미터로 입력한 배열과 같은 shape의 배열을 만드는 zeros_like, ones_like, full_like 함수도 제공합니다.

이 함수를 이용하여 배열 생성하고 초기화할 수 있습니다.

 

 

1) np.zeros 함수

  • zeros(shape, dtype=float, order='C')

  • 지정된 shape의 배열을 생성하고, 모든 요소를 0으로 데이터를 만듭니다.

[예제코드] 

#2행 3열을 숫자 0으로 채워 배열 만들기 

data = np.zeros((2, 3))
data

[결과]

array([[0., 0., 0.],
       [0., 0., 0.]])

 

[예제코드] 

# 처음 제로스를 사용하면 데이터 타입이 실수로 나옵니다
data.dtype

[결과]

dtype('float64')

 

[예제코드] 

# 조금 더 깔끔하게 보여주기 위해 정수로 데이터 타입을 바꾸겠습니다

data2 = data.astype("int")
data2.dtype

[결과]

dtype('float64')

 

 

2) np.ones 함수

  • np.ones(shape, dtype=None, order='C')
  • 지정된 shape의 배열을 생성하고, 모든 요소를 1로 넣어줍니다. 

[예제코드] 

data = np.ones((2,3,3))
data

[결과]

array([[[1., 1.],
        [1., 1.],
        [1., 1.]],

       [[1., 1.],
        [1., 1.],
        [1., 1.]]])

 

 

 

3) np.arange 함수

  • numpy.arange([start,] stop[, step,], dtype=None)
  • 시작점(start)부터 마지막(stop) 미만까지 간격(step)으로 데이터 생성한 후 배열을 만들어줍니다 
  • 범위내에서 간격을 기준 균등 간격의 배열
  • 요소의 객수가 아닌 데이터의 간격을 기준으로 배열 생성

[예제코드] 

#한개의  숫자(n) 만 입력하면, 자동으로 0부터 n-1까지 숫자가 출력됩니다

np.arange(5)

[결과]

array([0, 1, 2, 3, 4])

 

[예제코드] 

# 5부터 9까지 숫자를 출력
np.arange(5, 10)

[결과]

array([5, 6, 7, 8, 9])

 

[예제코드] 

#5부터 9까지 2step을 뛰어서 
np.arange(5, 10, 2)

[결과]

array([5, 7, 9])

반응형

+ Recent posts