앞의 포스트에는 numpy의 데이터 기본적인 생성 및 조작방법을 보았다면, 이번 포스트는 numpy의 대표적인 함수들과 메서드들을 알아볼 차례이다.
1. 데이터의 구조를 알아보는 메서드 : .ndim, .shape, .size, .dtype
import numpy as np
arr1 = np.array(
[1,2,3]
)
print(arr1.shape, arr1.dtype,arr1.ndim, arr1.size)
'''
shape : (3,)
dtype : int32
ndim : 1
size : 3
'''
arr2 = np.array([
[1,2,3],
[4,5,6]
])
print(arr2.shape, arr2.dtype, arr2.ndim, arr2.size)
'''
shape : (2,3)
dtype : int32
ndim : 2
size : 6
'''
arr3 = np.array([
[1,2,3]
])
print(arr3.shape, arr3.dtype,arr3.ndim, arr3.size)
'''
shape : (1,3)
dtype : int32
ndim : 2
size : 3
'''
(1) shape
shape는 이름에서도 알 수 있듯이 해당 데이터의 전체적인 모양, 즉 차원과 원소 갯수를 알 수 있게 해준다.
arr1에서의 (3,)의 의미는, 1차원에 해당하는 원소의 갯수가 3개라는 뜻이다.
arr2에서의 (2,3)의 의미는, 행렬로 생각하면 편하다. 실제로 거의 유사한 의미이다. 여기선 (2,3)이니까 2행 3열로 이루어진 ndarray 데이터를 의미한다.
(2) dtype
data type의 준말로, 사실상 type()의 효과와 동일하다. 즉 해당 데이터가 무슨 종류의 데이터인지 반환해준다.
예시는 다 int32로 통일하였다.
(3) ndim
number of dimension의 준말이다. 즉 차원의 갯수(크기)이며, 해당 데이터의 차원이 어느정도인지 판별해준다. 근데 사실상 shape 메서드로 바로 알 수 있기 떄문에 shape보다 효용성은 떨어지는 느낌이다. 그래도 만약에 데이터의 차원이 시각적으로 매우 복잡하다면 ndim이 더 유용할 것이다.
(4) size
해당 데이터 내부의 총 원소 갯수를 반환한다. 그냥 간단히 말하면 행렬 내부의 총 원소 갯수라고도 할 수 있겠다.
2. 데이터 생성에 관련된 함수 : arange, ones, zeros, full, eye, ones_like, linspace
# arange
arr4 = np.arange(start = 0, stop = 7)
arr4
# ones
arr5 = np.ones(shape = (2,2))
arr5
# zeros
arr6 = np.zeros(shape = (2,2))
arr6
# full
arr7 = np.full(shape = (2,2), fill_value = 5)
arr7
# eye
arr8 = np.eye(2)
arr8
# ones_like
arr9 = np.ones_like(arr4,shape =(2,-1))
arr9
# linspace
arr10 = np.linspace(start = 1, stop = 20, endpoint = True, num = 20)
arr10
위의 예시들은 결과들을 캡쳐해서 시각적으로 보여주는게 말로 하는 설명보다 좋다고 생각한다.
python의 range 함수와 기능이 같다.
shape에 해당하는 행렬을 만들되, 내부 원소들 모두 1로 만드는 함수이다.
ones 함수와 똑같다. 단지 내부 원소를 모두 0으로 생성한다.
이 함수도 ones, zeros 함수와 똑같다. 하지만 fill_value 파라미터로 내부 원소를 무엇으로 채울 것인지 내가 따로 설정이 가능하다.
선형대수에서 매우 중요한 단위행렬을 생성하는 함수이다. 그런데 np.identity라는 함수도 똑같이 단위행렬을 생성하는데, 둘의 차이점은 eye 함수는 파라미터 k를 통해 1로 나열된 대각선의 위치를 이동할 수 있고, identity는 할 수 없다라는 점이다.
ndarray 데이터를 shape 형태에 맞게 변형시킴과 동시에 내부 원소를 모두 1로 바꿔준다. 자매품으로 np.zeros_like, np.full_like가 있다.
이름에서도 알 수 있듯이, linearly spaced vector들을 생성하는 함수이다.
해당 예시를 설명하자면, 1에서 시작(start = 1)하고 20에서 끝나는(stop = 20) 범위에 따라 순서대로 20개의 원소를 가지는(num = 20) ndarray 데이터를 생성한다. endpoint의 의미는, 만약 파라미터 값이 True면 stop에 해당하는 값도 데이터 내부에 포함시킨다는 뜻이고 False면 포함시키지 않겠다는 뜻이다.
3. 데이터의 차원을 조정하는 함수 : reshape, resize, flatten, ravel
arr1 = np.arange(20)
arr1
'''
출력 : array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
'''
arr2 = arr1.reshape(2,10)
arr2
'''
출력 : array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
'''
arr3 = arr1.reshape(4,5)
arr3
'''
출력 : array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
'''
우선 reshape 메서드는 기존의 ndarray 데이터를 다른 shape으로 변경해주는 메서드이다. 즉 해당 데이터를 내가 원하는 차원으로 변경할 수 있다. 위의 예시를 보면 알겠지만, 기존의 1차원이던 arr1을 reshape을 통하여 2차원인 arr2와 arr3으로 바꾸었다. 그런데 만약에 내가 처리하는 데이터의 차원과 사이즈가 매우 크고 복잡하다면, 우리는 reshape에 지정해줄 파라미터를 둘 다 알기가 어렵다. 예를 들면 arr1 = np.arange(1023200405) 같이 사이즈 자체가 크면 , reshape할 때 필요한 파라미터를 찾기가 곤란하다. 하지만 방법이 있다.
arr1 = np.arange(1023200405)
arr_1 = arr1.reshape(5,-1)
arr_1
'''
array([[ 0, 1, 2, ..., 204640078, 204640079,
204640080],
[ 204640081, 204640082, 204640083, ..., 409280159, 409280160,
409280161],
[ 409280162, 409280163, 409280164, ..., 613920240, 613920241,
613920242],
[ 613920243, 613920244, 613920245, ..., 818560321, 818560322,
818560323],
[ 818560324, 818560325, 818560326, ..., 1023200402, 1023200403,
1023200404]])
'''
이런 식으로 reshape 내부의 파라미터에 숫자를 넣고, 그 다음 -1을 파라미터로 넣으면 처음에 넣은 숫자에 알맞는 shape을 자동적으로 찾아준다.
resize는 이런 reshape와 동일한 기능을 해주는 함수이다.
arr1 = np.arange(10)
np.resize(arr1,new_shape = (2,5))
'''
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
'''
reshape와 차이점은, 단지 메서드이냐 함수이냐의 차이점이다. 보통은 reshape를 더 많이 쓰는 것 같다.
지금까지 살펴본건, 1차원, 저차원의 데이터를 다차원으로 reshape,resize하는 것을 정리한 것이다. 그럼 반대로 다차원 데이터를 1차원으로 바꾸는 방법은 없을까? 물론 reshape를 사용할 수도 있다.
arr = np.array([[
[[1,2,3],[1,2,3],[1,2,3]]
]])
arr2.reshape(-1), arr2.reshape(-1).ndim
'''
arr2.reshape(-1) : array([1, 2, 3, 1, 2, 3, 1, 2, 3]),
arr2.reshape(-1).ndim : 1
'''
다만 이런 방법말고 flatten(), ravel()이라는 방법도 존재한다.
arr.flatten()
'''
array([1, 2, 3, 1, 2, 3, 1, 2, 3])
'''
arr.ravel()
'''
array([1, 2, 3, 1, 2, 3, 1, 2, 3])
'''
'투자를 위한 코딩 > Python' 카테고리의 다른 글
Numpy(1) - 생성,자료형 변환,슬라이싱,차원 (0) | 2020.09.10 |
---|---|
Numpy 개요 (0) | 2020.09.07 |
댓글