[NumPy] 02. ndarray 변경하기
Updated:
import numpy as np
2.1. ndim, shape, size, dtype, itemsize, nbytes
- ndarray.ndim: ndarray가 지닌 차원을 나타낸다. len(ndarray.shape)과 동일하다.
- ndarray.size: ndarray의 전체 원소 수를 반환한다.
- ndarray.dtype: ndarray 원소의 data type을 반환한다. (자세한 타입은 Numpy Reference 참고)
- ndarray.itemsize: ndarray 원소의 byte 크기를 반환한다.
- ndarray.nbytes: ndarray 전체 원소의 byte 크기를 반환한다. ndarray.size * ndarray.itemsize와 동일하다.
a = np.array([[1,2,3],[4,5,6]])
print("a.ndim:",a.ndim,",len(a.shape):",len(a.shape))
print("a.size:",a.size)
print("a.dtype:",a.dtype)
print("a.itemsize:",a.itemsize)
print("a.nbytes:",a.nbytes)
a.ndim: 2 ,len(a.shape): 2
a.size: 6
a.dtype: int64
a.itemsize: 8
a.nbytes: 48
2.2. reshape ndarray, resize ndarray
- np.reshape(ndarray,newshape), ndarray.reshape(newshape): ndarray의 shape을 newshape으로 변경한 새로운 ndarray를 반환한다. (단, newshape의 총 원소의 수는 기존 ndarray의 총 원소의 수와 동일해야한다.)
-1 shape?
shape을 표현할 때 -1이 포함되어 있는 경우가 있다. -1은 더이상 계산하지 않아도 확실하게 shape을 알 수 있을 때 쓴다.
size가 12인 ndarray가 존재한다고 가정해보자. shape을 (2,6), (3,4), (4,3), (1,12) 등으로 다양하게 구성할 수 있을 것이다. 이 때 (2,-1)이라고 shape을 표현해보자. size가 12이고 shape중 첫번째 자리가 2로 결정되어있기 때문에 나머지 2번째 자리는 6인것을 쉽게 알 수 있다. (-1,2)이라고 shape을 표현해보자. size가 12이고 두번째 자리가 2로 결정되어있기 때문에 첫번째 자리가 6인것을 쉽게 알 수가 있다.
이렇듯 -1은 더이상 계산하지 않아도 나머지 shape 자리를 알 수 있을 때 쓴다. 그 자리를 -1로 대체해서 쓴다고 보면 된다.
-1은 특정 shape 부분을 강조하거나 size가 클 때 자주 쓰인다.
a = np.array([[1,2,3],[4,5,6]])
b = np.reshape(a,(3,2))
print("a:\n",a)
print("b:\n",b)
c = np.arange(12).reshape((3,4))
print("c:\n",c)
a:
[[1 2 3]
[4 5 6]]
b:
[[1 2]
[3 4]
[5 6]]
c:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
- np.resize(ndarray,newshape): ndarray의 shape을 newshape으로 변경한 새로운 ndarray를 반환한다.
- ndarray.resize(newshape): ndarray의 shape을 newshape으로 변경한다. (새로운 ndarray를 반환하지 않는다.)
이 때 newshape의 총 원소의 수는 기존 ndarray의 총 원소의 수와 동일하지 않아도 된다. 따라서 사용에 주의가 필요하다.
만약 newshape의 원소의 수가 기존 원소의 수보다 많다면 부족한 만큼 첫 원소부터 반복해서 채워 넣는다.
a = np.array([[1,2,3],[4,5,6]])
b = np.resize(a,(3,2))
print("a:\n",a)
print("b:\n",b,'\n')
c = np.resize(a,(3,4))
print("c:\n",c,'\n')
a.resize((3,4))
print("a:\n",a)
a:
[[1 2 3]
[4 5 6]]
b:
[[1 2]
[3 4]
[5 6]]
c:
[[1 2 3 4]
[5 6 1 2]
[3 4 5 6]]
a:
[[1 2 3 4]
[5 6 0 0]
[0 0 0 0]]
2.3. dtype 변경하기
- dtype parameter 추가: ndarray를 만드는 method parameter에 dtype=newtype을 추가하면 newtype으로 dtype이 변경된다.
- ndarray.astype(newtype): ndarray의 dtype을 newtype으로 변경해준다.
a = np.array([1.5,2.5,3.5],dtype=np.int8)
print("a:",a)
b = np.arange(6,dtype=np.float32)
print("b:",b)
c = a.astype(np.bool8)
print("c:",c)
a: [1 2 3]
b: [0. 1. 2. 3. 4. 5.]
c: [ True True True]
2.4. copy, view
- copy: ndarray 객체를 깊은 복사한다. (원본에 영향을 미치지 않음)
- view: ndarray 객체를 얕은 복사한다. (원본에 영향을 미침)
copy를 하면 원본에 영향을 미치지 않지만 메모리를 그만큼 더 차지하고 view는 원본에 영향을 미치지만 메모리를 공유하기 때문에 메모리를 덜 차지한다.
a = np.arange(6).reshape((2,3))
b = a.copy()
c = a.view()
b[1,2] = 10
print("b:\n",b)
print("a:\n",a,'\n')
c[1,2] = 10
print("c:\n",c)
print("a:\n",a)
b:
[[ 0 1 2]
[ 3 4 10]]
a:
[[0 1 2]
[3 4 5]]
c:
[[ 0 1 2]
[ 3 4 10]]
a:
[[ 0 1 2]
[ 3 4 10]]
2.5. flatten, ravel
- ndarray.flatten(): ndarray를 vector로 만든 새로운 ndarray를 반환한다.
- ndarray.ravel(): ndarray를 vector로 만든 새로운 ndarray를 반환한다.
두 메소드 모두 벡터로 만든다는 공통점이 있지만 flatten은 copy하고 ravel은 view이다.
a = np.arange(6).reshape((2,3))
b = a.flatten()
print("a:\n",a)
print("b:",b,'\n')
c = np.arange(12).reshape((4,3))
d = c.ravel()
print("c:\n",c)
print("d:",d)
a:
[[0 1 2]
[3 4 5]]
b: [0 1 2 3 4 5]
c:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
d: [ 0 1 2 3 4 5 6 7 8 9 10 11]
Leave a comment