Python 배열 인덱싱의 기능 + 배열 연산 (9강-10강)
9강_배열 인덱싱의 유용한 기능 익히기
#배열 인덱싱
- 슬라이싱 : 파이썬 리스트와 유사하게, numpy에서도 슬라이싱이 가능
numpy배열을 슬라이싱하면, 그 결과는 언제나 원본 배열의 부분배열이다.
그러나, 정수 배열 인덱싱을 하는 경우에는 원본과 다른 배열을 만들 수 있다.
배열 인덱싱(array indexing)은 팬시 인덱싱(fancy indexing)이라고도 한다.
numpy의 아주 강력한 기능 중의 하나이다.
- 배열 인덱싱의 유용한 기능 중의 하나는 행렬의 각행에서 하나의 요소를 선택하거나
바꾸는 기능이다.
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
>>> a
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
#인덱스를 저장할 배열을 생성
>>> idx=np.array([0,2,0,1])
>>> id
<built-in function id>
>>> idx
array([0, 2, 0, 1])
>>> np.arange(4)
array([0, 1, 2, 3])
>>> a[np.arange(4),idx]
array([ 1, 6, 7, 11])
>>> a[np.arange(4),idx] *=2
>>> a
array([[ 2, 2, 3],
[ 4, 5, 12],
[14, 8, 9],
[10, 22, 12]])
# 배열 array의 4개의 행 중에서 각각 0,2,0,1번째에 해당하는 수를 출력
# 출력한 수의 값이 1,6,7,11이라, a[np.arange(4),idx]의 값이 그렇게 출력됨
# 해당 명령어에 *=2를 추가로 입력하면, * 2의 값만큼 출력
>>> import numpy as np
>>> b=np.array([0,1,2,3,4,5,6,7,8,9])
>>> idx=np.array([True,False,True,False,True,False,True,False,True,False])
>>> b[idx]
array([0, 2, 4, 6, 8])
#bool을 이용한 index 방법
# % : 사칙연산 이외에도 중요한 연산자(모두연산자)
>>> b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b%2
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=int32)
#2로 나눈 나머지값을 출력해줌
>>> b%2==0
array([ True, False, True, False, True, False, True, False, True, False])
#b를 2로 나누었을 때, 나머지가 0이 맞는지 여부를 확인
>>> b[b%2==0]
array([0, 2, 4, 6, 8])
#b 중에서 b를 2로 나누었을때 나머지가 0인 데이터만을 뽑아서 출력
#배열 연산 : 기본적인 수학함수는 배열의 각 요소별로 동작함.
#연산자 또는 numpy 함수 모듈을 통해 동작함.
>>> x=np.array([[1,2],[3,4]], dtype=np.float64)
>>> y=np.array([[5,6],[7,8]], dtype=np.float64) #사용자가 data type를 지정해줌
>>> x
array([[1., 2.],
[3., 4.]])
>>> y
array([[5., 6.],
[7., 8.]])
>>> x+y
array([[ 6., 8.],
[10., 12.]])
>>> np.add(x,y) #덧셈 값을 구하는 함수
array([[ 6., 8.],
[10., 12.]])
>>> np.subtract(x,y) #뻴셈 값을 구하는 함수
array([[-4., -4.],
[-4., -4.]])
>>> np.multiply(x,y) #곱셈 값을 구하는 함수
array([[ 5., 12.],
[21., 32.]])
>>> np.divide(x,y) #나눗셈 값을 구하는 함수
array([[0.2 , 0.33333333],
[0.42857143, 0.5 ]])
>>> np.sqrt(x,y) #제곱근을 구하는 함수
array([[1. , 1.41421356],
[1.73205081, 2. ]])
>>> x==2 #해당 숫자에 대한 참,거짓을 구하는 함수
array([[False, True],
[False, False]])
>>> x>3 #부등호로 참,거짓을 구하는 함수
array([[False, False],
[False, True]])
>>> (x>3)&(y>6) # And를 이용하여 참,거짓을 구하는 함수
array([[False, False],
[False, True]])
# F&F=F, F&T=F, T&T=T
10강_배열 연산
# numpy에서 제공하는 내적 함수 dot()을 이용한 계산
#매트릭스의 벡터의 곱을 구할 떄 주로 이용됨
>>> import numpy as np
>>> x=np.array([[1,2],[3,4]])
>>> y=np.array([[5,6],[7,8]])
>>> v=np.array([9,10])
>>> w=np.array([11,12])
#벡터 : 1차원 형태 / 행렬 : 2차원 형태 를 의미
# v,w는 벡터 x,y는 행렬
#스칼라 : 하나의 숫자를 의미 / 벡터 : 여러개의 숫자
#벡터*벡터의 곱
>>> print(v.dot(w))
219
>>> print(np.dot(v,w))
219
# 9*11 + 10*12 = 219 이기 떄문
# v[0]*w[0] + v[1]*w[1] = 219 인것과 같다.
#행렬*벡터의 곱
>>> print(x.dot(v))
[29 67]
>>> #rank=1. 1차원이라는 의미이다. x[0,0]*v[0]+x[0,1]*v[1]=29이고,
>>> #x[1,0]*v[0]+x[1,1]*v[1]=67이다.
>>>
>>> print(np.dot(x,v))
[29 67]
#행렬*행렬의 곱
>>> print(x.dot(y))
[[19 22]
[43 50]]
>>> print(np.dot(x,y))
[[19 22]
[43 50]]
>>> #유용한 함수 sum()
>>> xx=np.array([[1,2],[3,4]])
>>> print(np.sum(x)) #x의 모든 요소에 대한 합을 계산
10
>>> print(np.sum(x, axis=0))
[4 6]
#1+3, 2+4의 값이 출력. axis=0은 각 컬럼에 대한 합계를 계산
>>> print(np.sum(x, axis=1))
[3 7]
#1+2, 3+4에 대한 값이 출력. axis=1은 각 행에 대한 합계를 계산