indexing
python list의 indexing과 slicing과 상당히 유사
import numpy as np
arr = np.arange(10,20,1)
print(arr) # [10 11 12 13 14 15 16 17 18 19]
for item in arr:
print(item)
for idx,item in enumerate(arr): # enumerate는 배열이 가지고 있는 index번호(튜플 형태)와 값 두 개를 뽑아내요.
print(idx,item)
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
slicing
arr = np.arange(0,5,1)
print(arr) # [0 1 2 3 4]
tmp = arr[0:3] # [0 1 2] 슬라이싱은 원본과 결괏값의 데이터 형태가 같아요
print(tmp) # [0 1 2]
arr[0] = 100
print(arr) #[100 1 2 3 4]
print(tmp) # [100 1 2]
#numppy의 ndarray에 대해서 slcing을 하면 새로운 복사본이 만들어지는 게 아닌 view가 만들어져요!
import numpy as np
arr = np.arange(0,5,1)
print(arr) # [0 1 2 3 4]
print(arr[0:3]) # [0 1 2] print(arr[0:3:1])이 생략된 형태
print(arr[0:-1]) # [0 1 2 3]
print(arr[0::2]) # [0 2 4] 처음부터 끝까지 범위 내에 2칸씩 증가하라는 의미
여기까지는 파이썬이랑 똑같아요.
arr = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
print(arr[1,2]) # 6 2차원 ndarray의 indexing
print(arr[2,:]) # [7 8 9] 1차원의 ndarray가 결과로 나와요(view)
#명시를 할 때 1차원은 기본적으로 열이에요. 2차원으로 넘어가면 행과 열이 존재, 차원이 늘면 행과 열의 구조가 여러 개 (면) , 지칭을 할 때 앞에서 부터 지칭을 해요. 그래서 arr 자체가 2차원 행, 렬 이기 때문에 숫자 하나만 주면 앞에 있는 행으로 인식해요.
print(arr[1:3]) # [[4 5 6]
#[7 8 9]]
Boolean Indexing
Boolean Indexing 은 배열의 각 요소의 선택 여부를 True, False로 구성된 Boolean Mask를 이용하여
지정하는 방식으로 Boolean Mask안에서 True로 지정된 요소만 indexing 하는 방식.
import numpy as np
arr = np.arange(0,10,1)
print(arr)
print(arr[3]) #3 기본 indexing
# print(arr[boolean mask]) 는 true 혹은 false로 구성된 list 나 ndaaray 예요.
# Boolean Mask 를 쓸 때 원본과 요소의 수가 같아야 해요.
b_mask= [True,False,False,False,False,True,False,False,True,True]
print(arr[b_mask]) # [0 5 8 9]
print(arr + 1) #numpy에서 연산은 각 요소마다 적용되는 수칙 연산 python은 리스트를 연결시킬 뿐이에요.
여기서 숫자 1은 shape이 없는 스칼라(scalar) 연산을 하기 위해 1차원 벡터로 늘려요.
만약 연산을 할 때 shape이 다르면 shape을 자동으로 맞추려고 해요. → broadcasting
#[ 1 2 3 4 5 6 7 8 9 10]
만약 ndarray에 사칙연산이 수행되려면 shape이 같아야 해요.
import numpy as np
arr = np.arange(0,5,1) # 0 1 2 3 4
arr2 = np.arange(10,15,1) # 10 11 12 13 14
print(arr + arr2)
# [10 12 14 16 18]
#예를 들어 arr = np.arrange(0,3,1)로 바뀌면 에러가 나요
값이 숫자처럼 하나밖에 없으면 문제가 되지 않지만 요소의 수가 달라져 범위가 지정되지 않아 broadcasting이 일어나지 않아요.
arr[arr % 2 == 0]
#array([0, 2, 4])
# 1부터 100까지 3의 배수의 개수는??
import numpy as np
arr = np.arange(1,101,1)
arr[arr % 3 == 0]
print(len(arr[arr % 3 == 0])) # 33
Fancy Indexing
ndarray에 index 배열을(list, ndarray)을 전달해서 indexing 하는 방식
arr = np.arange(10,15,1)
print(arr) # [10 11 12 13 14]
print(arr[1]) # 11 숫자 indexing(기본)
print(arr[[0, 2, 3]]) # 0 2 3 은 index 번호
# [10 12 13]
import numpy as np
arr = np.arange(0,12,1).reshape(3,4).copy()
print(arr)
#indexing(기본)
print(arr[2,1]) #9
print(arr[1:2,2]) # [6] 2차원에서 슬라이싱을 했기 때문에 6이 아닌 [6], 인덱싱은 차원이 줄지만 슬라이싱은 원래 차원을 유지!
print(arr[1:2,2:3]) #[[6]] 행에 대해 나온 2차원에서 다시 슬라이싱
print(arr[[0,2],2]) # [ 2 10] Fancy Indexing 은 내가 원하는 것만 드러냄 행에 대해서 0과 2만 드러내고 열은 2 열이에요.
print(arr[[0,2],2:3]) # [[ 2]
#[10]]
print(arr[[0,2],[0,2]]) #[[ 0 10] 둘 다 Fancy Indexing 은 사용할 수 없어요
방법 1 (추천)
print(arr[np.ix_([0,2],[0,2])]) # [[ 0 2] np.ix_ 을 이용해 사용할 수 있어요.
#[ 8 10]]
방법 2
arr[[0,2]][:,[0,2]]
#array([[ 0, 2],
# [ 8, 10]])
'머신러닝 딥러닝' 카테고리의 다른 글
| 0818 Numpy 6 (0) | 2021.08.18 |
|---|---|
| 0817 Numpy5 (0) | 2021.08.17 |
| 0816 Numpy 3 (0) | 2021.08.16 |
| 0816 Numpy2 (0) | 2021.08.16 |
| 0816 Numpy (0) | 2021.08.16 |
댓글