본문 바로가기
머신러닝 딥러닝

0817 Numpy4

by 대금부는개발자 2021. 8. 17.
SMALL

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]])

LIST

'머신러닝 딥러닝' 카테고리의 다른 글

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

댓글