[파이썬] NumPy 예제

JunMyung Lee·2022년 5월 7일
0

파이썬

목록 보기
1/5
연산 함수설명연산 함수설명
square()제곱mean()평균
sqrt()제곱근(루트)var()편차
exp()지수승std()표준편차
log()로그min()최소값
add()덧셈max()최대값
sum()합계argmin()최소값의 인덱스
cumsum()누적합argmax()최대값의 인덱스
import numpy as np
"""
배열은 빠르고 간단하게 연산을 처리 할 수 있다.

NumPy는 데이터를 연속된 메모리블럭에 저장하고, 일반적인 파이썬 자료형보다 더 적은 메모리를 사용한다.
또한 내부 연산은 C 언어로 작성되어 메모리를 직접 조작해 처리하기 때문에 배열을 빠르고 효율적으로 처리 할 수 있다.
리스트에서 연산을 수행하기 위해서는 for 문과 같은 반복문을 사용해서 아이템을 하나씩 꺼내서 처리하고 넣는 형태로 진행해야 한다.
배열은 이러한 과정 없이 모든 아이템에 한꺼번에 연산을 적용할 수 있다.
바로 이러한 이유가 numpy 패키지가 데이터 처리에 강력한 이유기도 하다.
"""
"""
가장 기본적인 배열은 np.array() 함수를 사용해서 만든다.
"""
list = [1,2,3]
array = np.array(list)
array
array([1, 2, 3])
"""
값을 하나씩 지정하지 않고, np.zeros()를 사용하여 0으로 초기화된 배열을 만들 수 있다.
"""
np.zeros(5)
array([0., 0., 0., 0., 0.])
"""
튜플을 사용해 0으로 초기화된 2차원 배열을 생성
"""
np.zeros((2,3))
array([[0., 0., 0.],
       [0., 0., 0.]])
"""
1로 초기화된 배열 생성
"""
np.ones(7)
array([1., 1., 1., 1., 1., 1., 1.])
"""
빈 배열 생성하기
단, empty는 데이터의 초기화 없이 배열을 생성한다. 그렇기 때문에 zeros, ones보다
배열을 생성하는 속도는 빠르지만, 의미없는 쓰레기 값으로 채워져 있기 때문에 사용시 유의
"""
print(np.empty(5))
[2.5e-323 3.0e-323 3.5e-323 4.0e-323 4.4e-323]
"""
파이썬 기본 내장 함수인 range와 유사하게 연속된 숫자를 채워서 배열을 만들기
"""
print(np.arange(10))
print(np.arange(20,30,2))
[0 1 2 3 4 5 6 7 8 9]
[20 22 24 26 28]
"""
랜덤값으로 배열 만들기
rand    ::: 균등분포에서 랜덤 추출
randint ::: 주어진 범위 안에서 랜덤 추출
randn   ::: 표준정규분포(평균이 0이고, 표준편차가 1인 정규분포)에서 랜덤 추출
normal  ::: 정규분포에서 랜덤 추출
seed    ::: 랜덤값 생성기의 시드 지정 (정해진 시드값에 따라 난수를 생성)
shuffle ::: 리스트나 배열의 순서를 섞음 (실무에 사용가능할듯)
"""
np.random.rand(2,3)
array([[0.1853592 , 0.67315673, 0.91549164],
       [0.18491776, 0.83095126, 0.85583572]])
"""
만들어진 배열의 차원을 변경해서 재정의 하기
"""
array = np.arange(16)
print(array)
print(array.reshape(4,4))
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
"""
배열안에 담긴 데이터 처리
shape    ::: 배열의 형태 확인
dtype    ::: 배열의 데이터 타입 확인
astype() ::: 배열의 데이터 타입 변경
"""
array = np.arange(16)
print(array)
print(array.shape)
print(array.dtype)
print(array.astype(float))
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
(16,)
int64
[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15.]
"""
Boolean Index
특정 조건에 해당하는 부분만 배열화 하기
"""
array = np.array([50,20,40,60,70])
print(array)
print(array >= 50)          # 조건 값으로 true, false 변환
print(array[array >= 50])   # 조건에 맞는 실제 값으로 배열 재 생성
[50 20 40 60 70]
[ True False False  True  True]
[50 60 70]
"""
NumPy 배열 연산하기
"""
array = np.arange(1,5)
print(array)
print(array + 2)
print(array * 2)
array2 = np.arange(1,5)
print(array2)
print(array + array2)  # 인덱스 번호가 다른 경우 예외 발생 (ValueError: operands could not be broadcast together with shapes (4,) (2,) )
"""
단순 List의 경우 연산처리가 안됨
"""
list = [1,2,3,4]
print(list)
print(list * 2) # + 2의 경우 예외 발생 (TypeError: can only concatenate list (not "int") to list)
[1 2 3 4]
[3 4 5 6]
[2 4 6 8]
[1 2 3 4]
[2 4 6 8]
[1, 2, 3, 4]
[1, 2, 3, 4, 1, 2, 3, 4]
"""
NumPy 배열 통계용 연산
"""
array = np.arange(1,5)
print(np.square(array))              # 제곱
print(np.sqrt(array))                # 제곱근
print(np.exp(array))                 # 지수승
print(np.log(array))                 # 로그
print(np.add(array, np.arange(5,9))) # 덧셈 인덱스 맞지 않으면 예외 발생 (ValueError: operands could not be broadcast together with shapes (4,) (2,) )
print(np.sum(array))                 # 합계
print(np.cumsum(array))              # 누적합
print(np.mean(array))                # 평균
print(np.var(array))                 # 편차
print(np.std(array))                 # 표준편차
print(np.min(array))                 # 최소값
print(np.max(array))                 # 최대값
print(np.argmin(array))              # 최소값 인덱스
print(np.argmax(array))              # 최대값 인덱스
[ 1  4  9 16]
[1.         1.41421356 1.73205081 2.        ]
[ 2.71828183  7.3890561  20.08553692 54.59815003]
[0.         0.69314718 1.09861229 1.38629436]
[ 6  8 10 12]
10
[ 1  3  6 10]
2.5
1.25
1.118033988749895
1
4
0
3
"""
배열 차원 변형
"""
print(np.arange(10))
print(np.arange(10).reshape(2,5))                      # 1차원 -> 2차원 배열로 변경
print(np.arange(10).reshape(2,5).transpose())          # 차원변형 가로 세로 변경
print(np.arange(10).reshape(2,5).T)                    # 축을 지정하지 않는 경우 약어로 다음과 같이 사용가능 ( = transpose())
print('-------------------------')
print(np.arange(27))
print(np.arange(27).reshape(3,3,3))                    # 1차원 -> 3차원 배열로 변경
print('-------------------------')
print(np.arange(27).reshape(3,3,3).transpose())        # 기본순서 (0,1,2)의 역순 (2,1,0)
print('-------------------------')
print(np.arange(27).reshape(3,3,3).transpose(1,0,2))   # 이해가 잘 되질 않지만 넘어간다.
#  np.save('shape_array',np.arange(27).reshape(3,3,3).transpose(1,0,2))  # shape_array.npy 파일명으로 저장
print('-------------------------')
print(np.load('shape_array.npy'))
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4]
 [5 6 7 8 9]]
[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]
[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]
-------------------------
[ 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]
[[[ 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]]]
-------------------------
[[[ 0  9 18]
  [ 3 12 21]
  [ 6 15 24]]

 [[ 1 10 19]
  [ 4 13 22]
  [ 7 16 25]]

 [[ 2 11 20]
  [ 5 14 23]
  [ 8 17 26]]]
-------------------------
[[[ 0  1  2]
  [ 9 10 11]
  [18 19 20]]

 [[ 3  4  5]
  [12 13 14]
  [21 22 23]]

 [[ 6  7  8]
  [15 16 17]
  [24 25 26]]]
-------------------------
[[[ 0  1  2]
  [ 9 10 11]
  [18 19 20]]

 [[ 3  4  5]
  [12 13 14]
  [21 22 23]]

 [[ 6  7  8]
  [15 16 17]
  [24 25 26]]]
profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.

0개의 댓글