Python/Numpy
넘파이 numpy (2) - arange, reshape, indexing
얆생
2023. 4. 21. 15:06
ndarray를 편리하게 생성하기 - arange, zeros, ones
- arange는 range와 유사한 기능, array를 range로 표현하는 것
- 디폴트 인자는 stop값, 0부터 9까지 1차원 ndarray를 만듬, start값도 부여 가능
In [4]:
import numpy as np
sequence_array = np.arange(10)
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)
[0 1 2 3 4 5 6 7 8 9]
int32 (10,)
- zeros는 튜플로 shape값을 입력하면 모든 값을 0으로 채운 해당 shape을 반환
- ones는 튜플로 입력하면 모두 1로 반환, dtype을 정해주지 않으면 디폴트는 float값
In [5]:
zero_array = np.zeros((3, 2), dtype='int32')
print(zero_array)
print(zero_array.dtype, zero_array.shape)
[[0 0]
[0 0]
[0 0]]
int32 (3, 2)
In [7]:
ones_array = np.ones((3, 2))
print(ones_array)
print(ones_array.dtype, ones_array.shape)
[1. 1.]
[1. 1.]
[1. 1.]]
float64 (3, 2)
ndarray의 차원과 크기를 변경하는 reshape()
- reshape는 ndarray를 특정 차원 및 크기로 변환, 원하는 크기를 인자로 입력
- (!0,)데이터를 (4,3)으로 변환할 수 없음 >> 지정된 사이즈로 변경 불가하면 오류 뜸
In [8]:
array1 = np.arange(10)
print('array1: \n', array1)
array2 = array1.reshape(2, 5)
print('array2: \n', array2)
array3 = array1.reshape(5, 2)
print('array3: \n', array3)
array1:
[0 1 2 3 4 5 6 7 8 9]
array2:
[[0 1 2 3 4]
[5 6 7 8 9]]
array3:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
In [9]:
array1.reshape(4,3)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_19452\1938297127.py in <module>
----> 1 array1.reshape(4,3)
ValueError: cannot reshape array of size 10 into shape (4,3)
- reshape을 실전에서 효율적으로 쓰는 경우는 인자에 -1 적용하는 경우, -1을 사용하면 원래 ndarray와 호환되는 새로운 shape로 변환해줌
In [10]:
array1 = np.arange(10)
print(array1)
array2 = array1.reshape(-1, 5) #고정된 5개의 column에 맞는 row를 자동으로 새로 생성하라는 의미
print('array2 shape:', array2.shape)
array3 = array1.reshape(5, -1) #고정된 5개의 row에 맞춰라
print('array3 shape:', array3.shape)
[0 1 2 3 4 5 6 7 8 9]
array2 shape: (2, 5)
array3 shape: (5, 2)
In [11]:
#10개의 1차원 데이터를 고정된 4개 column에 맞출 순 없음, 에러 발생 경우
array1 = np.arange(10)
array2 = array1.reshape(-1, 4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_19452\3765126453.py in <module>
1 #10개의 1차원 데이터를 고정된 4개 column에 맞출 순 없음, 에러 발생 경우
2 array1 = np.arange(10)
----> 3 array2 = array1.reshape(-1, 4)
ValueError: cannot reshape array of size 10 into shape (4)
- reshape(-1,1)과 같은 형태로 자주 사용, 반드시 1개의 column을 가진 ndarray로 변환함을 보장
- 여러개의 ndarray를 stack이나 concat으로 결합할 때 형태 통일해서 유용하게 사용
In [13]:
array1 = np.arange(8)
array3d = array1.reshape((2,2,2))
print('array3d: \n', array3d.tolist())
#3차원 ndarray를 2차원으로 변환
array5 = array3d.reshape(-1,1)
print('array5: \n', array5.tolist())
print('array5 shape:', array5.shape)
#1차원을 2차원으로 변환
array6 = array1.reshape(-1,1)
print('array6: \n', array6.tolist())
print('array6 shape', array6.shape)
array3d:
[[[0, 1], [2, 3]], [[4, 5], [6, 7]]]
array5:
[[0], [1], [2], [3], [4], [5], [6], [7]]
array5 shape: (8, 1)
array6:
[[0], [1], [2], [3], [4], [5], [6], [7]]
array6 shape (8, 1)
넘파이의 ndarray의 데이터 세트 선택하기 - 인덱싱(indexing)
1. 단일 값 추출
In [14]:
array1 = np.arange(start=1, stop=10)
print('array1:', array1)
value = array1[2] #3번째 index위치의 데이터
print('value:', value)
print(type(value)) #이제 ndarray가 아니라 ndarray내의 데이터값임을 의미
array1: [1 2 3 4 5 6 7 8 9]
value: 3
<class 'numpy.int32'>
In [16]:
#데이터값 수정하기
array1[0] = 9
array1[8] = 0
print('array1:', array1)
array1: [9 2 3 4 5 6 7 8 0]
In [17]:
#다차원 ndarray에서 단일 값 추출
array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3)
print(array2d)
print('(row=0, col=0) index 가리키는 값:', array2d[0, 0])
print('(row=0, col=1) index 가리키는 값:', array2d[0, 1])
print('(row=1, col=0) index 가리키는 값:', array2d[1, 0])
print('(row=2, col=2) index 가리키는 값:', array2d[2, 2])
[[1 2 3]
[4 5 6]
[7 8 9]]
(row=0, col=0) index 가리키는 값: 1
(row=0, col=1) index 가리키는 값: 2
(row=1, col=0) index 가리키는 값: 4
(row=2, col=2) index 가리키는 값: 9
- 정확한 표현은 row, column보다는 axis0, axis1 이 맞음
2. 슬라이싱 slicing
In [18]:
array1 = np.arange(start=1, stop=10)
array3 = array1[0:3]
print(array3)
print(type(array3))
[1 2 3]
<class 'numpy.ndarray'>
In [19]:
#2차원 ndarray에서 슬라이싱하기
array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3)
print('array2d:\n', array2d)
print('array2d[0:2, 0:2] \n', array2d[0:2, 0:2])
print('array2d[1:3, 0:3] \n', array2d[1:3, 0:3])
print('array2d[1:3, :] \n', array2d[1:3, :])
print('array2d[:, :] \n', array2d[:, :])
print('array2d[:2, 1:] \n', array2d[:2, 1:])
print('array2d[:2, 0] \n', array2d[:2, 0])
array2d:
[[1 2 3]
[4 5 6]
[7 8 9]]
array2d[0:2, 0:2]
[[1 2]
[4 5]]
array2d[1:3, 0:3]
[[4 5 6]
[7 8 9]]
array2d[1:3, :]
[[4 5 6]
[7 8 9]]
array2d[:, :]
[[1 2 3]
[4 5 6]
[7 8 9]]
array2d[:2, 1:]
[[2 3]
[5 6]]
array2d[:2, 0]
[1 4]
In [21]:
print(array2d[0])
print(array2d[1])
print('array2d[0] shape:', array2d[0].shape, 'array2d[1] shape:', array2d[1].shape)
[1 2 3]
[4 5 6]
array2d[0] shape: (3,) array2d[1] shape: (3,)
3. 팬시 인덱싱 fancy indexing
In [22]:
array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3)
array3 = array2d[[0, 1], 2]
print('array2d[[0, 1], 2] => ', array3.tolist())
array4 = array2d[[0, 1], 0:2]
print('array2d[[0, 1], 0:2] => ', array4.tolist())
array5 = array2d[[0, 1]]
print('array2d[[0, 1]] => ', array5.tolist())
array2d[[0, 1], 2] => [3, 6]
array2d[[0, 1], 0:2] => [[1, 2], [4, 5]]
array2d[[0, 1]] => [[1, 2, 3], [4, 5, 6]]
4. 불린 인덱싱 boolean indexing
- 조건 필터링과 검색을 동시에 할 수 있음
- 인덱스를 지정하는 []내에 조건문을 그대로 쓰면됌
In [23]:
array1d = np.arange(start=1, stop=10)
#[]안에 array1d > 5 Boolean indexing을 적용
array3 = array1d[array1d > 5]
print('array1d > 5 불린 인덱싱 값:', array3)
array1d > 5 불린 인덱싱 값: [6 7 8 9]
In [25]:
array1d > 5
#5보다 큰 데이터있는 위치에는 True 반환, 이 조건 자체를 []안에 입력하면 False값은 무시하고 True만 자동 변환해서 반환
Out[25]:
array([False, False, False, False, False, True, True, True, True])
In [26]:
boolean_indexes = np.array([False, False, False, False, False, True, True, True, True])
array3 = array1d[boolean_indexes]
print('불린 인덱스로 필터링 결과:', array3)
불린 인덱스로 필터링 결과: [6 7 8 9]
In [27]:
#직접 인덱스 집합을 만들어 대입한 것과 동일
indexes = np.array([5, 6, 7, 8])
array4 = array1d[indexes]
print('일반 인덱스로 필터링 결과:', array4)
일반 인덱스로 필터링 결과: [6 7 8 9]