반응형
- reshape()
- revel()
- resize()
reshape()
ndarray의 차원과 크키 변경
arr = np.arange(10)
print(arr)
arr2 = arr.reshape(2, 5)
print(arr2)
arr3 = arr.reshape(5, -1)
print(arr3)
# arr
[0 1 2 3 4 5 6 7 8 9]
# arr2
[[0 1 2 3 4]
[5 6 7 8 9]]
# arr3
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
-1을 인자로 사용하면 원래 배열과 호환되는 새로운 shape으로 변환해 주며,
지정된 사이즈로 변경이 불가능하면 error가 나타난다.
(= 요소의 수가 맞지 않으면 view가 생성되지 않는다.)
arr4 = arr.reshape(4, -1)
print(arr4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [34], in <cell line: 1>()
----> 1 arr4 = arr.reshape(4, -1)
2 print(arr4)
ValueError: cannot reshape array of size 10 into shape (4,newaxis)
요소 10개짜리 1차원 array를 4개의 행을 가진 행렬로 나타낼 수 없기 때문에 error가 난다.
위에서 view라는 표현을 썼는데 reshape은 원래의 데이터의 shape을 바꾸어 보여주는 view의 역할으로
원래의 데이터와 값을 공유한다.
arr = np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])
print("arr: \n",arr)
new_arr = arr.reshape(3,4)
print("new_arr: \n",new_arr)
new_arr[0,0] = 100
print("arr: \n", arr)
print("new_arr: \n",new_arr)
arr:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
new_arr:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
arr:
[[100 2 3 4 5 6]
[ 7 8 9 10 11 12]]
new_arr:
[[100 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
new_arr의 값을 바꾸니 arr값도 바뀐 것을 확인할 수 있다.
따라서 복사본을 만들고 싶다면 copy()를 이용해야한다.
copy_arr = arr.reshape(3,4).copy()
print("copy_arr: \n",copy_arr)
print()
copy_arr[0,0] = 486
print("arr: \n", arr)
print("copy_arr: \n",copy_arr)
copy_arr:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
arr:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
copy_arr:
[[486 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
reshape은 주로 (-1, 1) 형태로 자주 사용된다.
어떤 형태의 array도 2차원의 컬럼이 1개인 ndarray로 변환시킬 수 있어, stack이나 concat으로 결합할 때 형태를 통일하기위해 사용
resize()
요소의 개수에 관계없이 ndarray를 변경한다.
부족한 요소는 0으로 채우고, 남는 값은 버린다.
resize 또한 복사본을 만들지 않고 원본을 변경한다.
resize는 데이터 손실의 위험이 있어 잘 사용하지 않는다.
arr = np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])
new_arr = arr.resize(3,5) #이렇게 사용하지 않음
# arr.resize(3,5) 이렇게 사용하는 것이 맞다.
print(new_arr)
print(arr)
arr.resize(2,3)
print(arr)
None
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 0 0 0]]
[[1 2 3]
[4 5 6]]
ravel()
1차원의 view를 만들어준다.
arr = np.array([[1,2,3,4,5,6],[7,8,9,10,11,12]])
one_d_arr = arr.ravel()
print(one_d_arr)
new_arr = arr.reshape(12)
# ravel과 같은 역할
print(new_arr)
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
반응형
'Programming > Numpy' 카테고리의 다른 글
[numpy][pandas] np.histogram()으로 도수분포표 만들기 (0) | 2022.03.23 |
---|---|
[numpy] ndarray의 indexing과 slicing (0) | 2022.03.15 |
[numpy] ndarray를 생성하는 여러가지 방법 2 - random (0) | 2022.03.15 |
[numpy] ndarray를 생성하는 여러가지 방법 1 (0) | 2022.03.15 |
[numpy] 데이터 핸들링을 위한 넘파이 (0) | 2022.03.15 |