Python

[Python] numpy 내적연산

SangRok Jung 2022. 9. 24. 12:52
반응형

내적연산


  • 베열 간의 곱셈에서는 요소별 연산과 벡터의 내적(dot product) 연산이 가능합니다.
  • 두 개의 행렬에서 첫 번째 행렬의 열 크기와 두 번째 행렬의 행 크기가 동일 해야 합니다.
  • m * n 행렬과 n * l 행렬, 벡터의 내적 연산은 m * l 의 행렬이 생성됩니다.

 

* 벡터의 내적 : 두 배열간의 곱셈

 

 

import numpy as np

x_1 = np.arange(1, 7).reshape(2, 3)
x_2 = np.arange(1, 7).reshape(3, 2)

print(x_1.dot(x_2))
# [[22 28]
#  [49 64]]
x_1 = np.arange(1, 11).reshape(2, 5)
x_2 = np.arange(1, 16).reshape(5, -1)

print(x_1.dot(x_2))
# [[135 150 165]
#  [310 350 390]]

 

 

 

 

 

Broadcasting operations(브로드 캐스팅 연산)


하나의 행렬과 스칼라 값들 간의 연산이나 행렬과 벡터 간의 연산

방송국의 전파가 퍼지듯 뒤에 있는 스칼라 값이 모든 요소를 연산합니다.

 

 

 

 

 

 

x = np.arange(1, 10).reshape(3, 3)

print(x + 10)
# [[11 12 13]
#  [14 15 16]
#  [17 18 19]]

print(x - 10)
# [[-9 -8 -7]
#  [-6 -5 -4]
#  [-3 -2 -1]]

print(x / 10)
# [[0.1 0.2 0.3]
#  [0.4 0.5 0.6]
#  [0.7 0.8 0.9]]

print(x * 10)
# [[10 20 30]
#  [40 50 60]
#  [70 80 90]]

print(x % 2)
# [[1 0 1]
#  [0 1 0]
#  [1 0 1]]

print(x + [10])
# [[11 12 13]
#  [14 15 16]
#  [17 18 19]]

print(x + [10, 11])
# ERROR

 

 

▶ 행렬과 스칼라 값 외에 행렬과 벡터, 벡터와 벡터 연산도 가능합니다.

 

 

 

 

x = np.arange(1, 13).reshape(4, 3)
v = np.arange(10, 40, 10)

print(x + v)
# [[11 22 33]
#  [14 25 36]
#  [17 28 39]
#  [20 31 42]]

 

 

 

 

 

 

넘파이의 성능 비교


 

 

 

 

 

 

비교 연산


연산 결과는 항상 boolean type을 가진 배열로 추출합니다.

 

▶ 브로드캐스팅 비교 연산

  • 하나의 스칼라 값과 벡터 간의 비교 연산은 벡터 내 전체 요소에 적용합니다.
x = np.array([4, 3, 2, 6, 8, 5])
print(x > 3)

# [ True False False  True  True  True]

 

 

▶ 요소별 비교 연산

  • 두 개의 배열 간 배열의 shape이 동일한 경우 같은 위치에 있는 요소들끼리 비교 연산합니다.
x = np.array([1, 3, 0])
y = np.array([2, 1, 7])

print(x > y)
# [False  True False]

 

 

 

 

▶ all()

  • 배열 내부의 모든 값이 참일 때 True, 하나라도 참이 아닐 경우 False 반환.
  • and 조건을 전체 요소에 적용합니다.

▶ any()

  • 배열 내부의 값 중 하나라도 참 일 때는 True, 모두 거짓일 경우 False 반환.
  • or 조건을 전체 요소에 적용합니다.
x = np.array([4, 6, 7, 3, 2])
print(x > 3)
# [ True  True  True False False]

print((x > 3).all())
# False

print((x > 3).any())
# True

print((x < 10).any())
# True

print((x < 10).all())
# True

print((x > 10).any())
# False

 

 

 

 

 

 

 

인덱스 반환 함수


▶ where()

  • 배열이 불인형으로 이루어졌을 때 참인 값들의 인덱스를 반환합니다.
  • True/False 경우 값을 지정할 수 없습니다.

 

x = np.array([4, 6, 7, 3, 2])
print(x > 5)
# [False  True  True False False]

print(np.where(x > 5))
# (array([1, 2]),)

print((np.where(x>5, 10, 20))) # 조건이 참이면 10, 거짓이면 20 반환.
# [20 10 10 20 20]

 

 

 

 

정렬된 값의 인덱스를 반환해주는 함수

▶ argsort

  • 배열 내 값들을 작은 순서대로 인덱스를 반환합니다.

▶ argmax

  • 배열 내 값들 중 가장 큰 값의 인덱스를 반환합니다.

argmin

  • 배열 내 값들 중 가장 큰 작은 값의 인덱스를 반환합니다.
x = np.array([4, 6, 7, 3, 2])
print(np.argsort(x))
#[4 3 0 1 2] 

print(np.argmax(x))
# 2

print(np.argmin(x))
# 4

 

 

 

 

 

 

 

인덱스를 활용한 데이터 추출


▶ boolean index

  • 배열에 있는 값들을 반환할 특정 조건을 boolean형의 배열에 넣어서 추출합니다.
    • 인덱스에 들어가는 배열은 boolean type이어야 합니다.
    • boolean type과 추출 대상이 되는 array의 shape이 같아야 합니다.
x = np.array([4, 6, 7, 3, 2])
cond = x > 3

print(x[cond])
# [4 6 7]

print(x.shape)
# (5,)

print(cond.shape)
# (5,)

 

 

 

 

▶ fancy index

  • 정수형 배열의 값을 사용하여 해당 정수의 인덱스에 위치한 값을 반환합니다.
  • 인덱스 항목에 넣을 배열은 정수로만 구성되어야 합니다.
  • 정수 값의 범위는 대상이 되는 배열이 가지는 인덱스의 범위 내 대상이 되는 배열과 인덱스 배열의 구조가 같은 필요는 없습니다.

 

x = np.array([4, 6, 7, 3, 2])
cond = np.array([1, 2, 0, 2, 2, 2,], int)

print(x[cond])
# [6 7 4 7 7 7]

print(x.take(cond))
# [6 7 4 7 7 7]

x = np.array([[1, 4], [9, 16]], int)
a = np.array([0, 1, 1, 1, 0, 0] , int)
b = np.array([0, 0, 0, 1, 1, 1], int)
print(x[a, b])
# [ 1  9  9 16  4  4]

반응형

'Python' 카테고리의 다른 글

[Python] Pandas  (0) 2022.09.27
[Python] 파일 저장  (0) 2022.09.27
[Python] numpy  (0) 2022.09.22
[Python] Anaconda 가상환경 생성  (0) 2022.09.21
[Python] CRAWLING - Element Access  (0) 2022.09.16