Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags more
Archives
Today
Total
관리 메뉴

StudyStudyStudyEveryday

[Python] Numpy - array 생성 / 인덱싱과 슬라이싱 / 함수 및 메서드 본문

Python/데이터 시각화

[Python] Numpy - array 생성 / 인덱싱과 슬라이싱 / 함수 및 메서드

따듯한붕어빵 2022. 4. 16. 13:42

 

 

 

Numpy

  • 수치 연산을 위한 라이브러리
  • 벡터, 행렬 등 수학 연산에 필요한 다양한 객체 및 기능 제공
  • C언어로 작성되어 효율적으로 계산됨

 

anaconda prompt에서 numpy를 설치하는 명령어는 다음과 같다.

conda install numpy

 

 

1-D array 생성

1-D array는 선형대수에서 벡터로 생각할 수 있다.

import numpy as np
import pandas as pd


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

z = np.zeros(4)  # 0 4개로 구성된 array 생성
u = np.ones(5)  # 1 4개로 구성된 array 생성

# [0, 1)의 uniform dist에서 random하게 3개의 수 추출
q = np.random.rand(3)
# standard normal dist에서 random하게 4개의 수 추출
w = np.random.randn(4)

# [-1, 1]사이 uniform dist에서 10개의 수 추출
Q = np.random.uniform(-1, 1, 10)
# 평균 10, 표준편차 1인 정규분포에서 20개의 수 추출
W = np.random.normal(10, 1, 20)

# (maximum - minimum) * x + minimum
(W - W.min()) / (W.max() - W.min())

# 0부터 9까지 총 10개의 정수 추출
r1 = np.arange(10)
# 1부터 10까지 2 간격으로 수 추출
r2 = np.arange(1, 10, 2)
v = np.linspace(1, 10, num=3)

 

 

2-D array 생성

2-D array는 행렬로 생각하면 된다.

X = np.array([[1, 2, 3], [4, 5, 6]])
Z = np.ones([4, 4])
R = np.arange(10).reshape(2, 5)
V = np.linspace(1, 10 ,4).reshape(2, 2)

벡터로 생성된 경우 reshape을 이용해 2차원 행렬로 변경시켜줄 수 있다.

 

 

N-D array 생성

리스트 혹은 튜플의 중첩 구조 (nested)를 이용하면 더 고차원 array를 생성할 수 있다.

XX = np.array([[[1, 2], [3, 4]],
               [[5, 6], [7, 8]]])
YY = np.arange(60).reshape(3, 4, 5)
ZZ = np.random.rand(2, 3, 3)

 

 

Indexing and Slicing

대괄호 통해 array의 인덱싱과 슬라이싱이 가능하다.

다만 2차원 이상의 array에서는 콤마(,)를 통해 차원을 구분한다.

# 1-d array
x = np.array([1, 2, 3, 4])
x[:1]
x[-1]
x[1:3]
x[x >= 2]  # list추출에서는 이렇게 인덱싱 안 됨

# 2-d array
X = np.array([1, 2, 3], [4, 5, 6])
X[0]
X[1, :]

# 3-d array
XX = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
XX[0, 1, :]
XX[XX > 4]

 

 

Numpy 내 유용한 여러 함수들

  • np.sort() : array내 원소 정렬
  • np.argsort() :  작은 값의 위치부터 출력 (R에서 order함수와 같음)
# 0~10 사이 정수 10개 비복원추출
x = np.random.choice(np.arange(0, 10), 
                     size=10, replace=False)

# ascending
np.sort(x) 
# descending
np.sort(x)[::-1]

# 작은 원소의 위치부터 출력 (R에서 order함수와 같음)
np.argsort(x)
x[np.argsort(x)]

# 2-d array X의 행 위치 바꿔주기
X = np.array([[1, 2, 3], [4, 5, 6]])
X[np.argsort(X[:, 0])[::-1], :]

 

    • np.concatenate : array를 합쳐준다.
x = np.arange(0, 5)
y = np.arange(5, 10)

np.concatenate([x, y])

x.shape
X = x[:, np.newaxis] # 차원을 늘려줌으로써 계산이 가능하게 만들어준다.
X = x[:, None]
Y = y[:, None]

np.concatenate([X, Y], axis=0) # 행 방향
np.concatenate([X, Y], axis=1) # 열 방향

 

  • np.reshape() : array 모양 및 차원 바꿔주기
x = np.arange(0, 4)
X = np.reshape(x, (2, 2))
np.reshape(X, [4, 1])

 

  • np.max(), np.min() : 최대값, 최소값 출력
  • np.argmax(), np.argmin : 최대값의 위치, 최소값의 위치 출력 
X = x.reshape(2, 5)
np.max(X, axis=0) # 행 방향
np.max(X, axis=1) # 열 방향

np.argmax(x) # 최대값의 위치
np.argmin(x) # 최소값의 위치

np.argmax(X, axis=0) # 행 방향 최대값의 위치
np.argmax(X, axis=1) # 열방향 최소값의 위치

 

  • np.repeat(x, 2) : 원소 두 번씩 반복
  • np.tile(x, 2) : 동일 array를 두 번 붙여준 효과
np.repeat(x, 2)
Out[118]: array([0, 0, 6, 6, 2, 2, 4, 4, 8, 8, 5, 5, 3, 3, 7, 7, 9, 9, 1, 1])

np.tile(x, 2)
Out[119]: array([0, 6, 2, 4, 8, 5, 3, 7, 9, 1, 0, 6, 2, 4, 8, 5, 3, 7, 9, 1])

 

 

Broadcasting

  • 두 array의 차원이 맞지 않은 경우, 작은 차원의 array를 반복해여 broadcasting 해준다.
## 1-d array + 상수
x = np.arange(0, 5)
x + 1
Out[10]: array([1, 2, 3, 4, 5])

y = 3
x + y
Out[12]: array([3, 4, 5, 6, 7])



## 2-d array + 1-d array
X = np.arange(0, 4).reshape(2, 2)
x = np.arange(0, 2)

X.shape
Out[15]: (2, 2)

x.shape
Out[16]: (2,)

X + x
Out[17]: 
array([[0, 2],
       [2, 4]])


Y = x.reshape([2, 1])

X.shape
Out[19]: (2, 2)

X + Y
Out[20]: 
array([[0, 1],
       [3, 4]])



## n-d array + 1-d array
XX = np.arange(0, 24).reshape(4, 3, 2)

Z = Y.reshape(1, 2)

XX.shape
Out[23]: (4, 3, 2)

Z.shape
Out[24]: (1, 2)

XX + Z
Out[25]: 
array([[[ 0,  2],
        [ 2,  4],
        [ 4,  6]],

       [[ 6,  8],
        [ 8, 10],
        [10, 12]],

       [[12, 14],
        [14, 16],
        [16, 18]],

       [[18, 20],
        [20, 22],
        [22, 24]]])

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments