본문 바로가기
개발 Tools/파이썬_Pandas & Numpy

numpy 기본편-2 ( sort(), dot(), .T, transpose(), [::-1], 연산자, random, rand(), randint())

by 전컴반 2021. 6. 24.
반응형

안녕하세요

어제 numpy 기본편-1 에 이어 numpy 기본편-2 를 시작하겠습니다

 

원하는 값만 출력

 

저희가 원하는 조건에 해당하는 애들만 출력하고 싶다면 자연스레 연산자가 떠오릅니다.

그럼 0부터 9까지 있는 숫자 중에 4보다 큰 애들만 출력해보겠습니다

 

array6 = np.arange(start=0, stop=10)

array10 = array6[array6 > 4]
array11 = array6 > 4
print(f"array6[array6>4]={array10}")
print(f"array6>4={array11}\n")

출력
array6[array6>4]=[5 6 7 8 9]
array6>4=[False False False False False  True  True  True  True  True]

 

4보다 큰 애들의 값을 보고 싶다면 리스트의 인덱스 값을 추출하여 호출합니다.

 

파이썬에서 True == 1, False == 0 을 의미합니다

 

1차원 정렬 sort()

 

정렬에는 2가지 방법이 있습니다

1. np.sort(array)

2. array.sort()

비슷하지만 의미는 다릅니다. 배열을 생성하여 정렬 해보겠습니다

 

array12 = np.array([4, 7, 1, 9])
np_sort_array12 = np.sort(array12)
sort_array12 = array12.sort()
print(f"np.sort(array12)={np_sort_array12}")
print(f"array12.sort()={sort_array12}")  # None

출력
np.sort(array12)=[1 4 7 9]
array12.sort()=None

 

오잉?

왜 None 인지 띠용했습니다. sort_array12 에는 None 이 저장되고 array12.sort()는 원본 배열인 array12 자체가 정렬됩니다. np.sort(array12) 는 원본 배열에 영향을 주지 않고 다른 변수에 저장합니다.

 

만약 원본이 훼손되지 않아야 한다면, array.sort() 를 해야 합니다

 

1차원 역정렬 sort()

 

자연스레 역정렬을 하고 싶습니다. 저는 처음에 당연히 reverse() 나 ascending=False 둘 중에 하나일 줄 알았습니다. 하지만 다른 방식을 따릅니다

 

np_sort_desc_array12 = np.sort(array12)[::-1]  # 역정렬
print(f"np.sort(array12)[::-1]={np_sort_desc_array12}\n")

출력
np.sort(array12)[::-1]=[9 7 4 1]

 

이처럼 역정렬은 [::-1] 을 사용합니다

 

이미 오름차순으로 정렬된 친구를 제일 뒤에서부터 출력하라는 의미입니다. 그러면 당연히 역정렬이 되겠죠??

 

2차원 정렬 sort()

 

이번에는 2차원을 정렬해 보겠습니다. 2차원이면 행과 열이 존재합니다. 그렇다면 행을 기준으로 정렬할 수도 있고, 열을 기준으로 정렬할 수도 있습니다

 

array13 = np.array([[10, 8],
                    [4, 3]])
row_sort_array13 = np.sort(array13, axis=0)
col_sort_array13 = np.sort(array13, axis=1)
print(f"array13=\n{array13}")
print(f"np.sort(array13, axis=0)=\n{row_sort_array13}")
print(f"np.sort(array13, axis=1)=\n{col_sort_array13}\n")

출력
array13=
[[10  8]
 [ 4  3]]
np.sort(array13, axis=0)=
[[ 4  3]
 [10  8]]
np.sort(array13, axis=1)=
[[ 8 10]
 [ 3  4]]

 

axis 는 축을 의미합니다. axis=0 은 행을 기준으로 합니다. axis=1 은 열을 기준으로 합니다

 

정렬 후 인덱스 변화

 

원래 인덱스가 있는데 정령 된 상태에서는 인덱스 번호가 어떻게 될까요?

처음 인덱스 번호를 그대로 따라갑니다

 

orgin_array = np.array([4, 1, 9, 2])
sort_orgin_array = np.argsort(orgin_array)
print(f"orgin_array_index=\n[0 1 2 3]")
print(f"sort_orgin_array_index=\n{sort_orgin_array}\n")

출력
orgin_array_index=
[0 1 2 3]
sort_orgin_array_index=
[1 3 0 2]

 

바뀐 숫자는 [1, 2, 4, 9] 입니다. 이에 인덱스 번호도 그래도 따라감을 명시합니다. 인덱스 번호를 찾아보는 함수는

argsort() 를 사용합니다

 

행렬의 내적(곱셈)

 

행렬이면 기본적으로 2차원이니 무조건 [[]] 를 사용해줘야 합니다.

 

행렬의 곱은 짝이 맞아야 이루어 짐을 명시합니다. 예를 들어, (2x3) * (3x1) 처럼 왼쪽 행렬의 열(3)과 오른쪽 행렬의 행(3)의 수가 맞아야 합니다. (2x3) * (4x1) 이면 곱셈을 할 수가 없습니다

 

A = np.array([[1, 2, 3],
              [4, 5, 6]])
B = np.array([[7, 8],
              [9, 10],
              [11, 12]])
C = np.dot(A, B)
print(f"A*B=\n{C}")

출력
A*B=
[[ 58  64]
 [139 154]]

 

위에선 (2x3) 행렬과 (3x2) 행렬을 만들었습니다

 

numpy 에서 행렬의 곱은 dot() 함수를 사용합니다. 출력은 (2x2) 로 나옵니다

 

행렬의 전치

 

행렬을 전치해야 할 때가 있습니다. 전치라 함은 뒤집는 것입니다. 변환이라고 보셔도 됩니다

 

2가지 방법이 있습니다

1. A.T 를 사용하는 법

2. np.transpose(A)

결과는 같습니다

 

정사각 행렬이면 대각 행렬을 기준으로 도치됩니다. 예를 들면, (2x3) 행렬을 (3x2) 행렬로 변환하는 겁니다. 코드를 보시는 게 이해하는데 더 빠르실 겁니다

 

A = np.array([[1, 2, 3],
              [4, 5, 6]])
D = A.T
E = np.transpose(A)
print(f"A.T=\n{D}")
print(f"np.transpose(A)=\n{E}")

출력
A.T=
[[1 4]
 [2 5]
 [3 6]]
np.transpose(A)=
[[1 4]
 [2 5]
 [3 6]]

 

대각 행렬인 [1,5] 를 기준으로 바뀐 걸 볼 수 있습니다. 두 가지 방법 중 편하신 걸 사용하시면 될 거 같습니다

 

랜덤

 

랜덤은 굉장히 유용하게 사용할 수 있습니다. 활용법이 많지만, 이번에는 제일 기본 2가지만 해보겠습니다

 

rand()

randint() 

를 사용하겠습니다

 

x = np.random.rand(4).round(2)
print(f"np.random.rand(4).round(2)={x}\n")

xx = np.random.randint(1, 7, 5)
print(f"np.random.randint(1, 7, 5)={xx}\n")

출력
np.random.rand(4).round(2)=[0.9  0.11 0.37 0.76]

np.random.randint(1, 7, 5)=[6 5 3 5 4]

 

rand() 함수는 0부터 1까지 중에 랜덤으로 숫자를 반환합니다. 뒤에 round(2) 는 소숫점 2자리까지만 출력하란 의미입니다

 

randint() 함수는 정수를 반환합니다. 위에 코드 기준으로 설명하자면 1부터 7까지 중에 랜덤으로 5개를 뽑아라 입니다.

이처럼 랜덤은 여러가지 기능을 제공합니다

 

마무리

 

이상으로 numpy 의 기본적인 건 한번 봤습니다.

앞으로 다른 코드를 치면서 numpy 를 익숙하게 사용하면 될 거 같습니다

 

감사합니다

 

 

 

반응형

댓글