* AIFFEL의 FUNDINEMENTAL 자료를 참고했습니다.

✔ Numpy Method 정리

😎 기본적인 Numpy문법 정리 입니다. 계속해서 추가 혹은 새로운 게시물로 업로드할 예정입니다.

numpy

  • numpy: 1.19.5
  1. ndarray
  2. shape
  3. type
  4. 단위행렬/0행렬/1행렬
  5. 행렬연산
  6. 슬라이싱/인덱싱
  7. random
  8. transpose
  9. 기본 통계 연산

ndarray

# 아래 A와 B는 결과적으로 같은 ndarray 객체를 생성합니다. 
A = np.arange(5)
B = np.array([0,1,2,3,4])  # 파이썬 리스트를 numpy ndarray로 변환

# 하지만 C는 좀 다를 것입니다. 
C = np.array([0,1,2,3,'4'])

# D도 A, B와 같은 결과를 내겠지만, B의 방법을 권합니다. 
# D = np.ndarray((5,), np.int64, np.array([0,1,2,3,4]))

print(A)
print(type(A))
print("--------------------------")
print(B)
print(type(B))
print("--------------------------")
print(C)
print(type(C))
# print("--------------------------")
# print(D)
# print(type(D))
  
>>>
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
['0' '1' '2' '3' '4']
<class 'numpy.ndarray'>
  

shape

# shape
A = np.arange(10).reshape(2, 5)   # 길이 10의 1차원 행렬을 2X5 2차원 행렬로 바꿔봅니다.

print("행렬의 모양:", A.shape)
print("행렬의 축 개수:", A.ndim)
print("행렬 내 원소의 개수:", A.size)
>>>
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
[0 1 2 3 4]
<class 'numpy.ndarray'>
--------------------------
['0' '1' '2' '3' '4']
<class 'numpy.ndarray'>
  

type

# type
A= np.arange(6).reshape(2, 3)
print(A)
print(A.dtype)
print(type(A))
print("-------------------------")

B = np.array([0, 1, 2, 3, 4, 5])  
print(B)
print(B.dtype)
print(type(B))
print("-------------------------")

C = np.array([0, 1, 2, 3, '4', 5])
print(C)
print(C.dtype)
print(type(C))
print("-------------------------")

D = np.array([0, 1, 2, 3, [4, 5], 6])  # 이런 ndarray도 만들어질까요?
print(D)
print(D.dtype)
print(type(D))
  
>>>
[[0 1 2]
 [3 4 5]]
int32
<class 'numpy.ndarray'>
-------------------------
[0 1 2 3 4 5]
int32
<class 'numpy.ndarray'>
-------------------------
['0' '1' '2' '3' '4' '5']
<U11
<class 'numpy.ndarray'>
-------------------------
[0 1 2 3 list([4, 5]) 6]
object
<class 'numpy.ndarray'>
  

identity/zero/ones

  
# 단위행렬
np.eye(3)
  
>>>
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
  
# 0 행렬
np.zeros([2,3])
>>>
array([[0., 0., 0.],
       [0., 0., 0.]])
 
# 1행렬
  
np.ones([3,3])
>>>
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
  

matrix operation

# 브로드캐스트
A = np.arange(9).reshape(3,3)
A

# ndarray A에 2를 상수배 했을 때,
A * 2
>>>
  array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
  
# ndarray A에 2를 더했을 때,
A + 2
>>>
  array([[ 2,  3,  4],
       [ 5,  6,  7],
       [ 8,  9, 10]])

# 3 X 3 행렬에 1 X 3 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
B = np.array([1, 2, 3])
print("A:", A)
print("B:", B)
print("\nA+B:", A+B)
>>>
  A: [[0 1 2]
   [3 4 5]
   [6 7 8]]
  B: [1 2 3]

  A+B: [[ 1  3  5]
   [ 4  6  8]
   [ 7  9 11]]

# 3 X 3 행렬에 3 X 1 행렬을 더했을 때
A = np.arange(9).reshape(3,3)
C = np.array([[1], [2], [3]])
print("A:", A)
print("C:", C)
print("\nA+C:", A+C)
>>>
  A: [[0 1 2]
   [3 4 5]
   [6 7 8]]
  C: [[1]
   [2]
   [3]]

  A+C: [[ 1  2  3]
   [ 5  6  7]
   [ 9 10 11]]
  
# 3 X 3 행렬에 1 X 2 행렬을 더하는 것은 허용되지 않습니다. 
A = np.arange(9).reshape(3,3)
D = np.array([1, 2])
print("A:", A)
print("D:", D)
print("\nA+D:", A+D) # error
  

print(np.array([1,2])+np.array([3,4]))
print(np.array([1,2])+3)
>>>
  [4 6]
  [4 5]
  

slicing/indexing

  #slice & indexing

# 3 X 3 행렬의 첫번째 행을 구해 봅시다. 
A = np.arange(9).reshape(3,3)
print("A:", A)
B = A[0]
print("B:", B)
>>>
  A: [[0 1 2]
   [3 4 5]
   [6 7 8]]
  B: [0 1 2]

  
# 0, 1을 인덱싱 하면 A의 첫번째 행에서 두번째 값을 참조합니다.
# 아래 두 결과는 정확히 같습니다.
print(A[0, 1])
print(B[1])
>>>
  1
  1
  
  
# 슬라이싱도 비슷합니다.
A[:-1]
>>>
  array([[0, 1, 2],
       [3, 4, 5]])
  

random

  • np.random.randint()
  • np.random.choice()
  • np.random.permutation()
  • np.random.normal()
  • np.random.uniform()
# 의사 난수를 생성하는 예제입니다. 여러번 실행해 보세요.

print(np.random.random())   # 0에서 1사이의 실수형 난수 하나를 생성합니다. 

print(np.random.randint(0,10))   # 0~9 사이 1개 정수형 난수 하나를 생성합니다. 

print(np.random.choice([0,1,2,3,4,5,6,7,8,9]))   # 리스트에 주어진 값 중 하나를 랜덤하게 골라줍니다.
>>>
  0.0193865137090653
  9
  7

# 무작위로 섞인 배열을 만들어 줍니다. 
# 아래 2가지는 기능면에서 동일합니다. 

print(np.random.permutation(10))   
print(np.random.permutation([0,1,2,3,4,5,6,7,8,9]))
>>>
  [4 0 7 2 6 9 1 5 3 8]
  [6 8 5 7 9 3 4 1 2 0]


# 아래 기능들은 어떤 분포를 따르는 변수를 임의로 표본추출해 줍니다. 

# 이것은 정규분포를 따릅니다.
print(np.random.normal(loc=0, scale=1, size=5))    # 평균(loc), 표준편차(scale), 추출개수(size)를 조절해 보세요.

# 이것은 균등분포를 따릅니다. 
print(np.random.uniform(low=-1, high=1, size=5))  # 최소(low), 최대(high), 추출개수(size)를 조절해 보세요.
>>>
  [ 0.31742023  0.80406453 -0.55785806 -1.4844065  -1.24216212]
  [0.68380915 0.45571294 0.99614325 0.83746214 0.97521404]
  
 

transpose

# transpose
A = np.arange(24).reshape(2,3,4)
print("A:", A)               # A는 (2,3,4)의 shape를 가진 행렬입니다. 
print("A의 전치행렬:", A.T)            
print("A의 전치행렬의 shape:", A.T.shape) # A의 전치행렬은 (4,3,2)의 shape를 가진 행렬입니다.
>>>
  A: [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

   [[12 13 14 15]
    [16 17 18 19]
    [20 21 22 23]]]
  A의 전치행렬: [[[ 0 12]
    [ 4 16]
    [ 8 20]]

   [[ 1 13]
    [ 5 17]
    [ 9 21]]

   [[ 2 14]
    [ 6 18]
    [10 22]]

   [[ 3 15]
    [ 7 19]
    [11 23]]]
  A의 전치행렬의 shape: (4, 3, 2)
  

# np.transpose는 행렬의 축을 어떻게 변환해 줄지 임의로 지정해 줄 수 있는 일반적인 행렬 전치 함수입니다. 
# np.transpose(A, (2,1,0)) 은 A.T와 정확히 같습니다.

B = np.transpose(A, (2,0,1))
print("A:", A)             # A는 (2,3,4)의 shape를 가진 행렬입니다. 
print("B:", B)             # B는 A의 3, 1, 2번째 축을 자신의 1, 2, 3번째 축으로 가진 행렬입니다.
print("B.shape:", B.shape)  # B는 (4,2,3)의 shape를 가진 행렬입니다.
>>>
  A: [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

   [[12 13 14 15]
    [16 17 18 19]
    [20 21 22 23]]]
  B: [[[ 0  4  8]
    [12 16 20]]

   [[ 1  5  9]
    [13 17 21]]

   [[ 2  6 10]
    [14 18 22]]

   [[ 3  7 11]
    [15 19 23]]]
  B.shape: (4, 2, 3)
  

aggregation

import numpy as np

def numbers():
    X = []
    number = input("Enter a number (<Enter key> to quit)") 
    # 하지만 2개 이상의 숫자를 받아야 한다는 제약조건을 제외하였습니다.
    while number != "":
        try:
            x = float(number)
            X.append(x)
        except ValueError:
            print('>>> NOT a number! Ignored..')
        number = input("Enter a number (<Enter key> to quit)")
    return X

def main():
    nums = numbers()       # 이것은 파이썬 리스트입니다. 
    num = np.array(nums)   # 리스트를 Numpy ndarray로 변환합니다.
    print("합", num.sum())
    print("평균값",num.mean())
    print("표준편차",num.std())
    print("중앙값",np.median(num))   # num.median() 이 아님에 유의해 주세요.

main()
>>>
  
  Enter a number (<Enter key> to quit)1
  Enter a number (<Enter key> to quit)2
  Enter a number (<Enter key> to quit)2
  Enter a number (<Enter key> to quit)3
  Enter a number (<Enter key> to quit)4
  Enter a number (<Enter key> to quit)12.0
  평균값 2.4
  표준편차 1.019803902718557
  중앙값 2.0
  
profile
Maybe I will be an AI Engineer?

0개의 댓글

Powered by GraphCDN, the GraphQL CDN