본문 바로가기
Python/Data Analysis

[파이썬, Python] Numpy 모듈 - 2️⃣ 행렬 연산자, arange, sort, 숫자 단일 연산

by coding-choonsik 2023. 6. 8.
728x90
반응형
SMALL

1. 행렬 연산자

 

  • 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야 함(행렬의 크기가 같아야함)
  • 같은 position끼리 연산됨 - 인덱스 번호가 같은 데이터 끼리 연산이 됨
  • 내적 연산(dot product)
    • 맞닿는 shape가 같아야 함
    • 내적은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1,2,3],
              [2,3,4]
              ])
b = np.array([[3,4,5],
              [1,2,3]
              ])
print(a.shape)
print(b.shape)

>>> (2, 3)
(2, 3)
# 덧셈 연산
a + b

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

# 뺄셈 연산
a - b

>>>  array([[-2, -2, -2],
       [ 1,  1,  1]])
       
# 곱셈 연산
a * b

>>> array([[ 3,  8, 15],
       [ 2,  6, 12]])
       
# 나눗셈 연산
a / b

>>> array([[0.33333333, 0.5       , 0.6       ],
       [2.        , 1.5       , 1.33333333]])
       
       
# 행렬곱(내적), dot product
a = np.array([[1,2,3],
              [1,2,3],
              [2,3,4]])
b = np.array([[1,2],
              [3,4],
              [5,6]])
print(a.shape, b.shape)
>>> (3, 3) (3, 2)

# 내적곱
np.dot(a, b)
>>> array([[22, 28],
       [22, 28],
       [31, 40]])

 


✅ 연산하고자 하는 두 행렬의 shape이 같지 않을 때 ➡ 에러!

c = np.array([[1,2,3],
              [2,3,4]
              ])
d = np.array([[3,4],
              [1,2]
              ])
print(c.shape)
print(d.shape)

>>> (2, 3)
(2, 2)


# 덧셈 연산
c + d 
>>> ValueError: operands could not be broadcast together with shapes (2,3) (2,2)

2. arange

  • 순차적인 값을 생성할 때 사용
  • python에서 range와 비슷
arr1 = range(1,11)
arr1 

>>> range(1, 11)  # 1부터 10이 되기 전까지

for i in arr1:
  print(i, end=' ')  # 출력되는 값을 옆으로 이어붙이기 위해
   
>>> 1 2 3 4 5 6 7 8 9 10 


arr2 = np.arange(1, 11)   # ndarray로 저장되는 특징
arr2 

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


for i in arr2:
  print(i, end=' ')

>>> 1 2 3 4 5 6 7 8 9 10   # arange로 생성된 ndarray도 iterable한 객체임

3. sort

✅ ndarray 정렬하기

ndarr1 = np.array([1,10, 5,6,8,2,3,6,7,9])
ndarr1

>>> array([ 1, 10,  5,  6,  8,  2,  3,  6,  7,  9])

# 오름차순 정렬하기
np.sort(ndarr1)  # 기본값은 오름차순

>>> array([ 1,  2,  3,  5,  6,  6,  7,  8,  9, 10])

ndarr1  
>>> array([ 1, 10,  5,  6,  8,  2,  3,  6,  7,  9])  # inplace연산x

 

# reverse 속성이 없음(내림차순을 하지 못함!)
np.sort(ndarr1, reverse=True)   

>>> TypeError: _sort_dispatcher() got an unexpected keyword argument 'reverse'


# 역방향으로 sort
np.sort(ndarr1)[::-1]

>>> array([10,  9,  8,  7,  6,  6,  5,  3,  2,  1])

문자열 정렬하기

str1 = 'Python'
print(str1[:])  # 모든 문자를 슬라이싱 
print(str1[::])  # print(str1[::1]) 과  같음 -> 1: 정방향, -1: 역방향 
print(str1[::-1])
print(str1[4:1:-1])   # 4번 인덱스부터 인덱스 1번 직전까지 역순으로 print
print(str1[4::-1])    # 4번 인덱스부터 인덱스 0번까지 역순으로 print

>>> Python
Python
nohtyP
oht
ohtyP

✅ 다차원의 ndarray 정렬하기

ndarr2d = np.array([[11,10,12,9],
                   [3,1,4,2],
                   [5,6,7,8]])
ndarr2d.shape    # 3행 4열

>>> (3, 4)


# 행정렬(axis=0), 행 요소에 대한 정렬!!!! 
np.sort(ndarr2d, axis=0) 

>>> array([[ 3,  1,  4,  2],
       [ 5,  6,  7,  8],
       [11, 10, 12,  9]])
       
# 열정렬(axis=1), 한 행 내부에서 각각 열 요소에 대한 정렬(오름차순)
np.sort(ndarr2d, axis=1)

>>> array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])
       
       
# 열 정렬 내림차순
np.sort(ndarr2d, axis=1)[:,::-1]  # 모든 행, 열방향으로 내림차순

>>> array([[12, 11, 10,  9],
       [ 4,  3,  2,  1],
       [ 8,  7,  6,  5]]) 
       
# 축의 마지막 방향
np.sort(ndarr2d, axis=-1)  # 현재는 열정렬과 동일함 -> 2차원은 (행, 열), 3차원은 (면, 행, 열) ...
>>> array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])

 


4. 숫자의 단일 연산

  • ndarray와 단일 숫자와의 연산
  • 각 position의 단일 수를 연산함
a = np.array([[1,2,3],
              [4,5,6]])
              
 
# 덧셈 연산
a + 3
>>> array([[4, 5, 6],
       [7, 8, 9]])
       
       
# 뺄셈 연산
a - 3
>>> array([[-2, -1,  0],
       [ 1,  2,  3]])
       

# 곱셈 연산
a * 3
>>> array([[ 3,  6,  9],
       [12, 15, 18]])
       
       
# 나눗셈 연산
a / 3
>>> array([[0.33333333, 0.66666667, 1.        ],
       [1.33333333, 1.66666667, 2.        ]])

b = np.array([[3,3,3],
             [3,3,3]])

# 덧셈 연산
 a + b
 >>> array([[4, 5, 6],
       [7, 8, 9]])

# 뺄셈 연산
a - b
>>> array([[-2, -1,  0],
       [ 1,  2,  3]])

# 곱셈 연산
a * b
>>> array([[ 3,  6,  9],
       [12, 15, 18]])
       
# 나눗셈 연산
a / b
>>> array([[0.33333333, 0.66666667, 1.        ],
       [1.33333333, 1.66666667, 2.        ]])

 

728x90
반응형
LIST